1. 定义
bean 的循环引用,并构成一个闭环。
2. 分类
- 构造函数循环依赖
3. 解决方式
3.1 解决单例循环依赖
三级缓存:
- singletonObjects
- earlySingletonObjects
- singletonFactories
正在创建缓存:
singletonCurrentlyInCreation
Spring 创建 bean 的过程会经历如下步骤:
- 从缓存中获取 bean
- 将要创建的 bean 加入正在创建缓存
- 创建 bean,如通过构造函数创建 bean
- (关键一步)加入三级缓存,如果该 bean 是单例、允许循环依赖、且正在创建中
- 属性注入,如 @Autowired 等,在此处调用 getBean 获取依赖的 bean
- 移除 bean 的正在创建状态
- bean 加入一级缓存
各步骤代码如下:
- 从缓存中获取 bean
- 将要创建的 bean 加入正在创建缓存
- 创建 bean,如通过构造函数创建 bean
- 加入三级缓存,如果该 bean 是单例、允许循环依赖、且正在创建中
- 属性注入,如 @Autowired 等,在此处调用 getBean 获取依赖的 bean
- 移除 bean 的正在创建状态
- bean 加入一级缓存