三级缓存解决循环依赖问题,循环依赖是指多个 Bean 之间相互依赖,形成了一个闭环。

1 为什么需要使用三级缓存

**一级缓存(singletonObjects):**也叫单例池,他是用来存放已经经历了完整生命周期的Bean对象 **二级缓存(earlySingletonObjects):**用于存放早期暴露出来的Bean对象或对象代理,Bean的生命周期未结束(属性未完全填充) **三级缓存(Map<String,ObjectFactory<?>>) singletonFactories ):**用于存放可以生成Bean的工厂

image.png

2 什么情况下循环依赖可以被处理

  1. 出现循环依赖的Bean必须要是单例
  2. 依赖注入的方式不能全是构造器注入的方式(很多博客上说,只能解决setter方法的循环依赖,这是错误的)

3 Spring如何解决循环依赖

image.png

getBean方法,这个方法有两层含义

  1. 创建一个新的Bean
  2. 从缓存中获取到已经被创建的对象

createBean方法,执行三个动作

  1. 实例化,简单理解就是new了一个对象
  2. 将beanName和lamda表达式加入三级缓存
  3. 属性注入,为实例化中new出来的对象填充属性
  4. 初始化,执行aware接口中的方法,初始化方法,完成AOP代理

参考文档

https://www.cnblogs.com/daimzh/p/13256413.html