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重要断点

posted @ 2022-08-23 15:09  微醺的小布  阅读(132)  评论(0)    收藏  举报