spring - 为什么 Spring 将我的一些依赖项注入(inject)为 CGLIB 代理以及为什么属性为空?

标签 spring cglib

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

enter image description here

CGLIB代理的2个都有一些带注解的方法,比如@Transactional@Async@Scheduled,就是这个为什么他们以这种方式被代理?

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

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

我使用的是 Spring Boot 2.4.2

最佳答案

关于CGLIB代理的使用:

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

如果要代理的目标对象至少实现一个接口(interface),则将使用 JDK 动态代理。目标类型实现的所有接口(interface)都将被代理。如果目标对象未实现任何接口(interface),则将创建 CGLIB 代理。”

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

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

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

spring singleton bean fields are not populated

关于spring - 为什么 Spring 将我的一些依赖项注入(inject)为 CGLIB 代理以及为什么属性为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68084650/

相关文章:

java - MongoDB Spring Data 如何聚合多个字段的计数?

java - 为什么我的 Java servlet 过滤器不能通过 HTTPS 工作?

java - 保留 CGLIB 代理上的注释?

java - JDK动态代理的优点

spring - 使用 Spring + Jedis 设置时,排序集如何存储在 redis 中?

spring - Spring boot 2.0 响应式(Reactive) webflux 配置中的默认线程数

java - 使用 CGLIB 创建实现新接口(interface)的 mixin

java - cglib 有替代品吗?

java - 从 Java 检查 CGLib 代理的 Groovy 类

java - 使用jetty启用WebApplicationInitializer实现