标签:void get 目标 jdbc color nbsp strong target 执行
一、解决何种问题?
将 “主要业务”和“次要业务”做解耦合处理
二、“主要业务”和“次要业务”的区分
“主要业务”:要实现的关键性任务
“次要业务”:起到辅助功能,辅助“主要业务”顺利实现,在项目中,“次要业务”往往大量重复出现。因此大量重复编写“次要业务”往往会影响开发效率
三、以使用JDBC操作数据库为例,来划分“主要业务”和“次要业务”
1、加载数据库驱动(次要业务)
2、建立连接(次要业务)
3、执行sql语句(主要业务)
4、遍历结果集(次要业务)
5、关闭资源(次要业务)
四、JDK动态代理
1、组成
· 接口:声明需要被监听的行为
· 代理实现类(实现InvocationHandler接口):将“次要业务”和"主要业务"绑定执行
· 代理对象:执行“主要业务”
2、代码示例
· 创建Interface
1 package com.kkb.jdk.proxy; 2 3 /** 4 * 声明需要被监听的方法:findByShopId、findByUserId 5 */ 6 public interface IOrderDao { 7 Object findByShopId(int shopId); 8 Object findByUserId(int userId); 9 }
· 创建实现类
1 package com.kkb.jdk.proxy; 2 3 public class OrderDao implements IOrderDao{ 4 @Override 5 public Object findByShopId(int shopId) { 6 System.out.println("执行根据 shopId 查询订单的 sql 语句"); 7 return null; 8 } 9 10 @Override 11 public Object findByUserId(int userId) { 12 System.out.println("执行根据 userId 查询订单的 sql 语句"); 13 return null; 14 } 15 }
· 创建代理实现类
1 package com.kkb.jdk.proxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 /** 7 * 代理实现类(实现InvocationHandler接口):用于“主要业务”和“次要业务”绑定执行 8 */ 9 public class Agent implements InvocationHandler { 10 11 private Object target; 12 13 public Agent(Object target){ 14 this.target = target; 15 } 16 17 @Override 18 public Object invoke(Object proxy, Method method, Object[] params) throws Throwable { 19 Object returnValue = null; 20 prePrimaryService();//执行次要业务 21 returnValue = method.invoke(target,params);//执行主要业务(method:需要执行的目标对象的方法,target:目标对象 params:目标对象的方法所需要的参数) 22 afterPrimaryService();//执行次要业务 23 return returnValue ; 24 } 25 26 /** 27 * 执行在主要业务之前的次要业务 28 */ 29 private void prePrimaryService(){ 30 System.out.println("加载数据库驱动"); 31 System.out.println("建立连接"); 32 } 33 34 /** 35 * 执行在主要业务之后的次要业务 36 */ 37 private void afterPrimaryService(){ 38 System.out.println("遍历结果集"); 39 System.out.println("关闭资源"); 40 } 41 }
· 创建代理类工厂
1 package com.kkb.jdk.proxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Proxy; 5 6 /** 7 * 代理实现类的工厂 8 */ 9 public class ProxyFactory { 10 public static Object getInstance(IOrderDao orderDao){ 11 //将目标对象传给代理实现类 12 InvocationHandler handler = new Agent(orderDao); 13 //ClassLoader loader: 代理对象的字节码文件的地址 14 //Class<?>[] interfaces: 需要监听的接口 15 //InvocationHandler h :代理实现类 16 return Proxy.newProxyInstance(orderDao.getClass().getClassLoader(),orderDao.getClass().getInterfaces(),handler); 17 18 } 19 }
· 创建测试类
1 package com.kkb.jdk.proxy; 2 3 public class Client { 4 public static void main(String[] args) { 5 //代理对象 6 IOrderDao orderDao = new OrderDao(); 7 //代理 8 IOrderDao proxy = (IOrderDao)ProxyFactory.getInstance(orderDao); 9 10 proxy.findByShopId(0); 11 System.out.println("\n----------------------------"); 12 proxy.findByUserId(0); 13 } 14 }
· 打印测试结果
加载数据库驱动 建立连接 执行根据 shopId 查询订单的 sql 语句 遍历结果集 关闭资源 ---------------------------- 加载数据库驱动 建立连接 执行根据 userId 查询订单的 sql 语句 遍历结果集 关闭资源
标签:void get 目标 jdbc color nbsp strong target 执行
原文地址:https://www.cnblogs.com/zhangxianming/p/9903288.html