Spring动态代理有哪些,有什么区别,默认是使用哪种?

两种动态代理

java动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
cglib动态代理:利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

spring中的动态代理

spring会自动在JDK动态代理和CGLIB之间转换
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理
3、可以通过配置强制使用CGLIB实现AOP ,配置方法为:
 (3.1)添加CGLIB库,SPRING_HOME/cglib/*.jar
 (3.2)在spring配置文件里面"proxy-target-class"属性设置为true

两种动态代理的区别

1、实现方式
 (1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
 (2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法因为是继承,所以该类或方法不要声明成final
2、性能差别
(1)使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
(2)在对JDK动态代理与CGlib动态代理的代码实验中看,1W次执行下,JDK7及8的动态代理性能比CGlib要好20%左右。


参考:Spring的两种动态代理:Jdk和Cglib 的区别和实现

更多精选文章
标签: 代理、cglib、动态、spring、jdk
一个创业中的苦逼程序员
笔试题


刷题


简历模板


AI算法


大数据


内推


推荐阅读:
阿里巴巴笔试面试大全
腾讯笔试面试大全
百度笔试面试大全
今日头条笔试面试大全
网易笔试面试大全
Google笔试面试大全
更多笔试面试大全
隐藏