Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。
一、JDK动态代理1.通过实现InvocationHandler接口来自定义自己的InvocationHandler;2.通过Proxy.getProxyClass0获得动态代理类(如果实现当前接口的代理类存在,直接从缓存中返回,如果不存在,则通过ProxyClassFactory来创建)3.通过反射机制获得代理类的构造方法(getConstructor)4.通过构造函数获得代理对象并将自定义的InvocationHandler实例对象传为参数传入5.通过代理对象调用目标方法二、CGLIB动态代理通过字节码技术为需要代理的目标对象创建一个子类对象,并在子类对象中拦截所有父类(即需要代理的类)方法的调用,然后在方法调用前后调用后都可以加入自己想要执行的代码。但因为采用的是继承,所以不能对final修饰的类和final方法进行代理。三、区别java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换