spring学习——proxy-target-class详解
<aop:aspectj-autoproxy proxy-target-class="true" />
aop:aspectj-autoproxy的含义是:启动@AspectJ注解驱动的切面 那么**proxy-target-class=“true”**是什么意思呢?
proxy-target-class属性决定代理的创建方式: true:启用cglib代理(基于类); false:启用jdk代理(基于接口);
JDK动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
效率对比
1、CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高不少;
2、但是CGLib在创建对象的时候所花费的时间却比JDK动态代理要多很多;
3、因此,对于singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理,反正,则比较适用JDK动态代理。
总结:高版本spring自动根据运行类选择JDK或CGLIB代理,我们无需设置proxy-target-class属性。当然也可以根据实际情况,通过配置来指定。
