博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java | JDK和CGLIB动态代理区别
阅读量:4088 次
发布时间:2019-05-25

本文共 1778 字,大约阅读时间需要 5 分钟。

JDK动态代理原理(jdk8):https://blog.csdn.net/yhl_jxy/article/details/80586785

CGLIB动态代理实现原理:https://blog.csdn.net/yhl_jxy/article/details/80633194

1、JDK动态代理

利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,

在调用具体方法前调用InvokeHandler来处理。

2、CGLIB动态代理

利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

3、何时使用JDK还是CGLIB?

1)如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP。

2)如果目标对象实现了接口,可以强制使用CGLIB实现AOP。

3)如果目标对象没有实现了接口,必须采用CGLIB库,Spring会自动在JDK动态代理和CGLIB之间转换。

4、如何强制使用CGLIB实现AOP?

1)添加CGLIB库(aspectjrt-xxx.jar、aspectjweaver-xxx.jar、cglib-nodep-xxx.jar)

2)在Spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>

5、JDK动态代理和CGLIB字节码生成的区别?

1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类。

2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,

     并覆盖其中方法实现增强,但是因为采用的是继承,所以该类或方法最好不要声明成final,

     对于final类或方法,是无法继承的。

6、CGlib比JDK快?

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代理消息确有点跟不上步伐。

7、Spring如何选择用JDK还是CGLIB?

在默认情况下,如果一个目标对象如果实现了接口Spring则会选择JDK动态代理策略动态的创建一个接口实现类(动态代理类)来代理目标对象,可以通俗的理解这个动态代理类是目标对象的另外一个版本,所以这两者之间在强制转换的时候会抛出java.lang.ClassCastException。而所以在默认情况下,如果目标对象没有实现任何接口,Spring会选择CGLIB代理, 其生成的动态代理对象是目标类的子类。上说的是默认情况下,也可以手动配置一些选项使Spring采用CGLIB代理。 org.springframework.transaction.interceptor.TransactionProxyFactoryBean是org.springframework.aop.framework. ProxyConfig的子类,所以可以参照ProxyConfig里的一些设置,将optimize和proxyTargetClass任意一个设置为true都可以强制Spring采用CGLIB代理。

接口:

 

实现类:

 

JDK代理实现:

 

CGLIB代理实现:

 

客户端测试类:

 

程序运行结果:

640?wx_fmt=png

JDK代理是不需要第三方库支持,只需要JDK环境就可以进行代理,使用条件:

1)实现InvocationHandler 

2)使用Proxy.newProxyInstance产生代理对象

3)被代理的对象必须要实现接口

CGLib必须依赖于CGLib的类库,但是它需要类来实现任何接口代理的是指定的类生成一个子类,覆盖其中的方法,是一种继承但是针对接口编程的环境下推荐使用JDK的代理;

你可能感兴趣的文章
C++ STL-deque基本原理
查看>>
socket阻塞与非阻塞,同步与异步
查看>>
Linux下的五种I/O模型
查看>>
【整理】I/O复用模型中的 select、poll、epoll
查看>>
阿里巴巴2018年校招研发C++笔试
查看>>
TX1上安装mavros时,出现UAS:GeographicLib exception: File not readable...错误
查看>>
2020软考系统架构设计师总结
查看>>
CRC冗余校验码简介
查看>>
Vue 自定义菜单条及下拉框
查看>>
Vue ElementUI el-dialog 可拖拽指令
查看>>
Vue ElementUI el-collapse 改造:手风琴
查看>>
1.项目初始化
查看>>
2.申请 Cesium Ion 密钥
查看>>
3.场景初始化
查看>>
4.获取鼠标移动位置
查看>>
0.各类资料
查看>>
5.WMTS 调用
查看>>
6.3dtiles 调用
查看>>
组件化:局部批量引入示例组件
查看>>
使用 Vuepress 创建自己的技术文档站
查看>>