Java代理模式之动态代理
动态代理与静态代理相比,代理对象不需要实现接口,动态代理又称JDK代理
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy利用InvocationHandler动态创建一个符合某一个接口的实例,生成目标类的代理对象。
通过Proxy.newProxyInstance(Class classLoader , Class[] interfaces ,InvocationHandler h) 获取代理对象
参数1:classLoader目标对象的classLoader
参数2:interfaces 目标对象实现的接口列表
参数3:h InvocationHandler对象 事件处理器
下面通过给保存用户信息的方法加事务来体验下动态代理的运用:
//接口 public interface IUserDao { void save(); }
//目标对象 public class UserDaoImpl implements IUserDao{ @Override public void save() { System.out.println("保存用户信息进入数据库"); } }
//通过代理工厂获取目标类的代理对象 public class ProxyFactory { public static <T> T getProxy(final Object target) { return (T) Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开始事务"); Object obj = method.invoke(target, args); //调用我们真正的对象方法 System.out.println("提交事务"); return obj; } }); } }
//测试类 public class Test { public static void main(String[] args) { IUserDao proxy = ProxyFactory.getProxy(new UserDaoImpl()); proxy.save(); } }
打印结果:
开始事务
保存用户信息进入数据库
提交事务
动态代理总结:
代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!