我有一个 @Service
,它有 4 个类 @Autowired
。其中 2 个似乎是具体类,但另外 2 个是 EnhancedBySpringCGLIB
。
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 - 为什么 Spring 将我的一些依赖项注入(inject)为 CGLIB 代理以及为什么属性为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68084650/