我想了解CGLIB包装(代理)Spring组件是否存在一些规则/条件。例如,以这种情况为例:
@Component
public class TestComponent {
}
@Service
//@Transactional(rollbackFor = Throwable.class)
public class ProcessComponent {
@Autowired
private TestComponent testComponent;
public void doSomething(int key) {
// try to debug "testComponent" instance here ...
}
}
如果我们像这样让它调试方法中的testComponent
字段,那么我们将看到它没有被CGLIB包装。
现在,如果我们取消注释@Transactional
注释并进行调试,我们将发现实例已包装:其类型为ProcessComponent$$EnhancerByCGLIB$$14456
或类似的东西。显然是因为Spring需要创建一个代理类来处理事务支持。
但是我想知道,有什么方法可以检测到如何以及何时发生这种包装?例如,Spring的源代码中的某些特定位置可调试以查找更多信息;或有关如何决定创建代理的规则的一些文档。
为您提供信息,我需要了解这一点,因为我面临的情况是我的应用程序中突然出现某些组件(不是@Transactional,上面的示例只是出于演示目的) 被代理(过去我发现了一个修订版本,而实际上没有。)最重要的问题是,这将影响也包含public final
方法的此类组件,另一个问题(也很重要)是,在类的设计/结构中必须进行了一些意外的更改。对于此类问题,我们当然必须设法找出发生了什么/谁做了导致此等事情的变更...
请注意,我们刚刚将应用程序从Spring Boot 2.1.0RELEASE升级到了2.1.10RELEASE。到目前为止,逐个检查代码修订是不可行的,因为已经有很多提交。
感谢您提供任何帮助。