Spring使用CGLIB的情况主要有两种:
1. 目标类没有实现接口:当目标类没有实现任何接口时,Spring会使用CGLIB来创建代理对象。CGLIB通过继承目标类并重写其中的方法来创建代理对象。这种情况下,Spring无法使用JDK动态代理,因为JDK动态代理要求目标类实现接口。
2. 强制使用CGLIB:在某些情况下,即使目标类实现了接口,也可以强制Spring使用CGLIB来创建代理对象。可以通过配置Spring的AopProxyFactoryBean的proxyTargetClass属性为true,或者在@EnableAspectJAutoProxy注解中设置proxyTargetClass属性为true,来强制使用CGLIB代理。
需要注意的是,使用CGLIB代理相对于JDK动态代理来说,会引入额外的依赖和性能开销。CGLIB代理是通过继承目标类来创建代理对象,因此会生成一个目标类的子类。在方法调用时,会先调用代理类的方法,再通过super关键字调用目标类的方法。这种继承关系会导致一些限制,例如无法代理final方法和无法代理私有方法。
总结起来,Spring使用CGLIB的情况是目标类没有实现接口或强制使用CGLIB代理。使用CGLIB代理可以解决目标类没有实现接口的情况,但也会引入额外的依赖和性能开销。因此,在选择使用JDK动态代理还是CGLIB代理时,需要根据具体情况进行权衡和选择。
本文暂时没有评论,来添加一个吧(●'◡'●)