SPRING中JDK动态代理和CGLIB代理的区别

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