=============================== Spring AOP动态代理之JDK动态代理 =============================== 动态代理类几乎可以为所有被代理类产生代理对象。 动态代理的两种实现方式: - JDK动态代理:通过被代理对象实现的接口产生代理对象 - CGLib动态代理:通过被代理类的子类产生代理对象 JDK动态代理类: public class JDKProxy implements InvocationHandler { private Object obj; // 被代理对象 private long btime; public JDKProxy(Object obj) { this.obj = obj; } // 产生并返回代理对象 // 代理对象实现了被代理对象的接口 // 在接口方法的实现中调用拦截器的invoke()方法 public Object getProxy() { return Proxy.newProxyInstance( obj.getClass().getClassLoader(), // 被代理对象的类加载器 obj.getClass().getInterfaces(), // 被代理对象的接口 this); // 拦截器 } @Override public Object invoke( Object proxy, Method method, Object[] args) throws Throwable { begin(); // / obj.insert(...) Object retval = method.invoke(obj, args); // - obj.modify(...) commit(); // \ obj.delete(...) return retval; } private void begin() { System.out.println("开启事务"); btime = System.nanoTime(); } private void commit() { System.out.println("提交事务(" + (System.nanoTime() - btime) / 1000 + "微秒)"); } } 测试: public class JDKProxyTest { public static void main(String[] args) { Dao dao = (Dao)new JDKProxy(new BookDaoImpl()).getProxy(); dao.insert(); // .invoke(..., insert, ...) dao.modify(); // .invoke(..., modify, ...) dao.delete(); // .invoke(..., delete, ...) } } 开启事务 在t_book表中插入一条记录 提交事务 开启事务 修改t_book表中的一条记录 提交事务 开启事务 在t_book表中删除一条记录 提交事务 例程:SpringAOP 接口 ___/ \____ 实|现 实|现 v v 代理类 被代理类 | | v v 代理对象----->被代理对象 拦截器 JDK动态代理是通过被代理类(如BookDaoImpl)实现的接口(如Dao)创建代理对象的: - 只能为实现了接口的类做代理 - 对于没有实现任何接口的类,无法为其创建动态代理