Spring通过注解annotation方式注入Bean时,采用动态代理,那么JDK代理和CGLIB代理区别?
发布日期:2021-10-02 15:13:36 浏览次数:2 分类:技术文章

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

切面编程是Spring中非常重要的一个模块,切面编程的实现原理是动态代理,那么动态代理又有两种实现方式:一种方法是直接实现JDK中的InvocationHandler接口,另一种方法是继承CGLIB。

首先如果不是很清楚两者的区别的话,记住一般情况下InvocationHandler要比CGLIB要好就行了。

(1)如果目标对象至少实现了一个接口,那么就用JDK动态代理,所有由目标对象实现的接口将全部都被代理。

(2)如果目标对象没有实现任何接口,就是个,那么就用CGLIB代理。

如今Spring的动态代理已经默认时JDK动态代理,实现类的单元测试中简单方式就是通过加资源注解明确实现类,再通过注入实现类接口实现Bean的依赖注入。

@AutoWired@Resource(name="areaServiceImpl")private AdminService adminServiceImpl;}

但是如果非要使用CGLIB的话,那么CGLIB可能有下面的问题:

  • 刚才提到了,InvocationHandler是实现的接口,而CGLIB则是继承的父类,那么由于继承的限制,如果父类中有final的成员,那么是继承不到的。

  • 还有从Spring 3.2以后不再将CGLIB放在项目的classpath下,而是将CGLIB类打包放在spring-core下面的org.springframework中。这个就意味着基于CGLIB的动态代理与JDK的动态代理在支持“just works”就一样了。

  • 在Spring 4.0中,因为CGLIB代理实例是通过Objenesis创建的,所以代理对象的构造器不再有两次调用。

(1)想要强制使用CGLIB,spring配置文件中<aop:config>下面的proxy-target-class属性为true

(2)对@AspectJ强制使用CGLIB的话,spring配置文件<aop:aspectj-autoproxy>下的proxy-target-class属性为true

添加CGLIB库,SPRING_HOME/cglib/*.jar在spring配置文件中加入

maven依赖

cglib
cglib

 

转载地址:https://blog.csdn.net/jinpengncu/article/details/82924758 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:jdk8环境下,用eclipse indigo进行Zookeeper集群java api客户端连接,因版本报错
下一篇:service层实现类serviceImpl单元测试,报错org.springframework.beans.factory.UnsatisfiedDependencyException,报代理错误

发表评论

最新留言

很好
[***.229.124.182]2024年03月27日 18时18分08秒