Spring 接机循环依赖 三级缓存

在 Spring 中,若创建 Bean 发生解决循环依赖会通过三级缓存解决。

  1. singletonObjects(一级缓存):存放 完整 的 Bean 对象;
  2. earlysingletonObjects(二级缓存):存放 Bean 的 早期(early)对象;
  3. singletonFactories(三级缓存):存放 Bean 的 工厂(Factory)对象;
// Spring 源码中的定义(AbstractBeanFactory)
 /** 一级缓存:存放完全初始化好的 bean(成品豆) */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

 /** 二级缓存:存放早期暴露的半成品 bean(已经实例化但还没完成属性填充和初始化) */
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

 /** 三级缓存:存放的是 ObjectFactory,代表正在创建中的 bean 的工厂(用于解决 AOP 代理问题) */
private final Map<String, SingletonBeanRegistry> singletonFactories = new HashMap<>(16);

image.png

循环依赖如何解决

Spring 循环依赖导致启动报错

  1. 开启对循环依赖的支持,需要在配置文件中加入
spring.main.allow-circular-references=true

  1. 如果不想加配置的话,也可以用@Lazy 注解,在@Autowired 地方增加即可
@Autowired
@Lazy
private PayChannelServiceFactory payChannelServiceFactory;

Spring---循环依赖探讨