Spring动态代理用JDK还是用CGLIB?
来源:互联网 发布:单片机电子设计与制作 编辑:程序博客网 时间:2024/05/20 11:19
切面编程是Spring中非常重要的一个模块,切面编程的实现原理是动态代理,那么动态代理又有两种实现方式,一种方法是直接实现JDK中的InvocationHandler
接口,另一种方法是继承CGLIB。
那么问题来了,这两种方法有啥区别呢,分别适用于什么情况呢?
首先如果不是很清楚两者的区别的话,记住一般情况下InvocationHandler
要比CGLIB要好就行了。
如果目标对象的代理至少实现了一个接口,那么就用JDK动态代理,所有由目标对象实现的接口将全部都被代理。如果目标对象没有实现任何接口,那么就用CGLIB代理。
但是如果非要使用CGLIB的话,那么CGLIB可能有下面的问题:
刚才提到了,
InvocationHandler
是实现的接口,而CGLIB则是继承的父类,那么由于继承的限制,如果父类中有final的成员,那么是继承不到的。还有从Spring 3.2以后不再将CGLIB放在项目的classpath下,而是将CGLIB类打包放在spring-core下面的org.springframework中。这个就意味着基于CGLIB的动态代理与JDK的动态代理在支持“just works”就一样了。
在Spring 4.0中,因为CGLIB代理实例是通过Objenesis创建的,所以代理对象的构造器不再有两次调用。
想要强制使用CGLIB,那么就设置<aop:config>
下面的proxy-target-class
属性为true
:
<aop:config proxy-target-class="true"> <!-- other beans defined here... --></aop:config>
要是使用@AspectJ强制使用CGLIB的话,可以配置<aop:aspectj-autoproxy>
下的proxy-target-class
属性为true
:
<aop:aspectj-autoproxy proxy-target-class="true"/>
参考文献:
https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html
- Spring动态代理用JDK还是用CGLIB?
- Spring: proxy-target-class 决定 用 CGlib 还是 JDK AOP 来生成代理
- spring(AOP)静态代理、JDK动态代理、cglib实现代理
- Spring AOP详解 、 JDK动态代理、CGLib动态代理
- Spring AOP详解 、 JDK动态代理、CGLib动态代理
- Spring AOP详解 、 JDK动态代理、CGLib动态代理
- CGLib&JDK动态代理
- 动态代理JDK cglib
- jdk、cglib动态代理
- 动态代理--Jdk、CGLIB
- jdk+cglib动态代理
- Spring AOP中的JDK动态代理与CGLIB代理
- jdk 静态代理、动态代理、cglib、spring AOP
- Spring jdk动态代理源码 as cglib代理源码
- 基于Spring AOP的JDK动态代理和CGLIB代理
- Spring---->JDK动态代理和CGLIB字节码生成
- Spring之JDK动态代理和cgLib的区别
- Java 动态代理(JDK&CGLib)
- OpenCV Python 学习笔记(三) 仿射变换
- Mybatis 浅析
- HDOJ2058The sum problem
- 初识javaweb之http协议和tomcat
- struts2 基本
- Spring动态代理用JDK还是用CGLIB?
- merge合并链表
- React Native组件生命周期
- 面向新手的Web服务器搭建(一)——IIS的搭建
- 《数据结构与算法-Python语言描述》读书笔记(8)第8章字典和集合(关键词:数据结构/算法/Python/字典/集合)
- 【Noip模拟】RP字符串
- 通信原理
- java 异常处理 Throwable Error 和Exception
- 经典算法之二维数组中的查找问题