gpt4 book ai didi

java - 何时以及如何创建 cglib-proxied 组件实例

转载 作者:行者123 更新时间:2023-12-02 09:16:16 24 4
gpt4 key购买 nike

我想了解 Spring 组件被 CGLIB 包装(代理)是否有一些规则/条件。例如,以这种情况为例:

@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。并且到目前为止通过修订检查代码修订是不可行的,因为已经有相当多的提交了。

任何形式的帮助将不胜感激,提前致谢。

最佳答案

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

关于java - 何时以及如何创建 cglib-proxied 组件实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58956908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com