1 动态代理, 2 1)代理对象,不需要实现接口; 3 2)代理对象的生成,是利用JDK API, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型;); 4 3) 动态代理, JDK代理, 接口代理; 5 6 JDK中生成代理对象的API: 7 |-- Proxy 8 static Object newProxyInstance( 9 ClassLoader loader, 指定当前目标对象使用类加载器 10 Class<?>[] interfaces, 目标对象实现的接口的类型 11 InvocationHandler h 事件处理器 12 ) 13 14 15 动态代理总结: 16 代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理! 17 (class $Proxy0 implements IuserDao) 18 19 思考: 20 有一个目标对象,想要功能扩展,但目标对象没有实现接口,怎样功能扩展? 21 Class UserDao{} 22 // 子类的方式 23 Class subclass extends UserDao{} 24 25 以子类的方式实现(cglib代理)
接口, 要干的活
1 public interface IUserDao { 2 3 void save(); 4 5 void update(); 6 }
目标对象必须实现接口
1 // 目标对象 2 public class UserDao implements IUserDao{ 3 4 @Override 5 public void save() { 6 System.out.println("目标对象,插入数据到DB中..."); 7 } 8 9 @Override 10 public void update() { 11 System.out.println("目标对象, 修改数据..."); 12 13 } 14 15 }
代理对象不用实现接口
1 public class ProxyFactory { 2 private Object target; 3 public ProxyFactory(Object target){ 4 this.target = target; 5 } 6 7 public Object getProxyInstance(){ 8 9 return Proxy.newProxyInstance( 10 target.getClass().getClassLoader(), 11 target.getClass().getInterfaces(), 12 new InvocationHandler(){ 13 14 @Override 15 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 16 System.out.println("开启事务"); 17 Object value = method.invoke(target, args);//== target.... args是方法的参数 18 System.out.println("提交事务"); 19 return value; 20 } 21 22 } 23 24 ); 25 } 26 }
干吧...
1 public class ProxyTest { 2 3 public static void main(String[] args) { 4 //2.动态代理 5 IUserDao target = new UserDao(); 6 IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance(); 7 proxy.save(); 8 proxy.update(); 9 /* 10 开启事务 11 目标对象,插入数据到DB中... 12 提交事务 13 14 开启事务 15 目标对象, 修改数据... 16 提交事务 17 */ 18 } 19 }