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

Why does Spring inject some of my dependencies as CGLIB proxies and why are the attributes null?

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

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

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

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

我正在使用 spring boot 2.4.2

关于CGLIB代理的使用:

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

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

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

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

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

spring singleton bean fields are not populated