Spring动态代理用JDK还是用CGLIB?

Spring中的切面编程利用动态代理技术实现,可以选择JDK或CGLIB。JDK代理适用于目标对象实现了接口的情况,而CGLIB则用于未实现接口的对象。CGLIB可能会遇到final成员无法代理的问题。自Spring 3.2起,CGLIB集成在spring-core中,4.0版本后,CGLIB代理对象构造不再有两次调用。若需强制使用CGLIB,可通过特定配置实现。
摘要由CSDN通过智能技术生成

切面编程是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值