【问题标题】:Why does Spring inject some of my dependencies as CGLIB proxies and why are the attributes null?为什么 Spring 将我的一些依赖项作为 CGLIB 代理注入,为什么属性为空?
【发布时间】:2021-06-23 00:02:11
【问题描述】:

我有一个 @Service,它有 4 个类 @Autowired。其中 2 个似乎是具体类,但另外 2 个是 EnhancedBySpringCGLIB

被CGLIB代理的2个都有一些带注解的方法,比如@Transactional@Async@Scheduled,这就是他们被这样代理的原因吗?

为什么这些 bean 上的属性都为空?我可以在这些类中放置一个断点,并在启动时查看它们,但是当它们被注入我的服务时,它们是空白的。

我检查了ApplicationContext,只创建了 1 个 bean。

我使用的是 Spring Boot 2.4.2

【问题讨论】:

    标签: spring cglib


    【解决方案1】:

    关于CGLIB代理的使用:

    “Spring AOP 使用 JDK 动态代理或 CGLIB 来为给定的目标对象创建代理。(只要您有选择,最好使用 JDK 动态代理)。

    如果要代理的目标对象实现了至少一个接口,那么将使用 JDK 动态代理。目标类型实现的所有接口都将被代理。如果目标对象没有实现任何接口,则将创建一个 CGLIB 代理。"

    来自https://docs.spring.io/spring-framework/docs/3.0.0.M3/reference/html/ch08s06.html

    关于为什么代理中的字段为空:

    在 CGLIB 代理中,不调用父类的构造函数。你可以在这里找到一个很好的解释:

    spring singleton bean fields are not populated

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 1970-01-01
      • 2010-12-15
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2018-04-13
      • 2013-03-13
      相关资源
      最近更新 更多