一级缓存:保存了完整的Bean实例,可以直接使用
二级缓存:保存了实例化以后还没有设置属性值的Bean实例,也就是一个空的对象,没有做依赖注入
三级缓存 :存放Bean工厂,它用来生成原始Bean对象并且放到二级缓存里面
三级缓存是为了解决循环依赖注入的问题,而且是单例的情况,其他情况是用不到三级缓存的
1. 先实例化目标Bean A,包装成一个ObjectFactory对象放到三级缓存
2. 再实例化目标Bean A 的成员Bean B, 放到三级缓存
3. Bean B 开始依赖注入,在三级缓存里面去找Bean A,完成了 Bean B下面成员Bean A的依赖注入
3. 再从三级缓存找到目标Bean移动到二级缓存,再从三级缓存中移除
4. 把不完整(只初始化了,属性并没有填充) 目标Bean注入到目标Bean的子Bean中(我艹,好绕)
5. Bean B 属性填充执行完以后初始化后放入一级缓存
6. 这个时候 Bean A 就可以拿到 Bean B的实例完成注入
7. 目标 Bean A 完成了属性填充,放入一级缓存
三级缓存核心思想就是把Bean的实例化和Bean中的属性依赖注入这两个过程分离出来
Spring 框架只能解决单例下的循环依赖注入,多例的情况下需要手动去解决