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

标签 java spring spring-boot cglib

我想了解 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/

相关文章:

java - 在 Android 中使用四向滑动的 RecyclerView

实现类的Java Null点异常?

java - Firestore google.cloud.Timestamp 解析

java - 当 Spring 中的一列属于复合主键时,如何按该列进行过滤

spring-boot - 读取数据时违反约束

java - 具有其他项目依赖项的 Eclipse 插件项目

java - CannotLoadBeanClassException : Cannot find class [org. springframework.jdbc.datasource.DriverManagerDataSource] 对于名称为 'dataSource' 的 bean

oracle - Oracle 和 Hibernate 中的 generatedValue 不起作用

java - 具有范围原型(prototype)的 Spring beans

spring-boot - 如何在 Spring Boot 中禁用 jndi 调试日志