为什么 Spring 将我的一些依赖项作为 CGLIB 代理注入,为什么属性为空?

我有一个 function check(a,b,c) { if (a === b && b === c) { console.log(a,c,'delete options.state'); } else { console.log(a,`this.set('controller.options.state','${['A','B','C'].filter((_,i) => [a,c][i]).join()}');`); } } check(false,false,false); check(false,true); check(false,true,true); check(true,false); check(true,true);,它有 4 个类 .as-console-wrapper { max-height: 100% !important; top: 0; }。其中 2 个似乎是具体类,但其他 2 个是 @Service

为什么 Spring 将我的一些依赖项作为 CGLIB 代理注入,为什么属性为空?

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

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

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

我使用的是 Spring Boot 2.4.2

handanlove521 回答:为什么 Spring 将我的一些依赖项作为 CGLIB 代理注入,为什么属性为空?

关于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

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

大家都在问