spring使用三级缓存解决循环依赖问题
1.什么是循环依赖
在容器中有两个对象A和B,A对象有一个属性为B,B对象有一个属性为A
2.两种属性注入方式
构造器注入和set方法注入,其中构造器注入不能解决循环依赖问题
3.spring的三级缓存
// DefaultSingletonBeanRegistry类中
// 一级缓存,用来存储已经经历完整生命周期的bean对象,即单例池
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
// 二级缓存,存储实例化但未完成初始化的bean-----为了提前曝光对象
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
// 三级缓存,存放生成bean的工厂-----为了提前曝光对象工厂
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
4.spring创建单例bean过程
spring创建对象分两步,创建原始bean对象,接着填充对象属性和初始化
1.首先进行实例化A,在初始化时发现需要B,于是将A放在三级缓存里,去实例化B
2.初始化B的时候,发现需要A,于是先查一级缓存,没有;再查二级缓存,没有;再查三级缓存,找到了A,然后把A放到二级缓存里,并删除三级缓存里的A
3.B初始化顺利完成,将自己放在一级缓存里(此时B里的A仍然处于中间态),然后回来继续创建A,直接从一级缓存里拿到B,A初始化完成,并将A放在一级缓存里
5.源码处理流程

6.源码debug重要断点


浙公网安备 33010602011771号