SPRING中JDK动态代理和CGLIB代理的区别
区别:
-
JDK:利用反射机制实现代理接口的匿名类
-
必须实现InvocationHandler
-
使用Proxy.newProxyInstance产生代理对象
-
被代理的对象必须要实现接口
-
CGLIB:针对类实现代理,主要是对指定的类生成一个子类,覆盖其中方法,CGLIB底层采用ASM字节码生成代理类
-
不需要实现接口,利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节代码生成子类处理
效率
-
使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,在jdk6之前比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
-
在jdk6、jdk7、jdk8逐步对JDK动态代理优化之后,在调用次数较少的情况下,JDK代理效率高于CGLIB代理效率,只有当进行大量调用的时候,jdk6和jdk7比CGLIB代理效率低一点,但是到jdk8的时候,jdk代理效率高于CGLIB代理,总之,每一次jdk版本升级,jdk代理效率都得到提升,而CGLIB代理消息确有点跟不上步伐。
SPRING如何选择JKD代理还是CGLIB代理?
-
当BEAN实现接口时,SPRING就会用JDK代理
-
当BEAN没有实现接口时,SPRING是用CGLIB实现的
-
可以强制使用CGLIB(在SPRING配置种加入<aop:aspectj-autoproxy proxy-target-class = "true">)

浙公网安备 33010602011771号