✅Spring 循环依赖细节
在 Spring 中,若创建 Bean 发生解决循环依赖会通过三级缓存解决。
singletonObjects
(一级缓存):存放 完整 的 Bean 对象;earlysingletonObjects
(二级缓存):存放 Bean 的 早期(early)对象;singletonFactories
(三级缓存):存放 Bean 的 工厂(Factory)对象;
✅Spring 循环依赖导致启动报错
我们应用的 pay 这个模块,在启动时候会报错。报错信息提示如下:
提示是有一个循环依赖的问题,即 PayApplicationService -> PayChannelServiceFactory -> MockPayChannelService -> PayApplicationService.
Spring不是引入了三级缓存,解决了循环依赖的问题吗?那为啥启动还报错呢?
Spring 2.6 开始,默认已经不开启对循环依赖的支持了
从 Spring Framework 5.3 开始,Spring 默认禁用了对循环依赖的支持,而在 Spring 2.6 中,这一行为得到了进一步的明确和强化
如果想要开启对循环依赖的支持,需要在配置文件中加入
java
spring.main.allow-circular-references=true
或者,如果不想加配置的话,也可以用@Lazy
注解,在@Autowired
地方增加即可:
java
@Autowired
@Lazy
private PayChannelServiceFactory payChannelServiceFactory;