什么时候以及如何创建cglib代理的组件实例

我想了解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。到目前为止,逐个检查代码修订是不可行的,因为已经有很多提交。

感谢您提供任何帮助。

gyz111427 回答:什么时候以及如何创建cglib代理的组件实例

您可以调试到org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(Class,String,TargetSource)。 如果找到任何顾问,则将代理该bean。

,

如果使用@Lookup方法注入,它还将代理组件类。

本文链接:https://www.f2er.com/3064930.html

大家都在问