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 @   微醺的小布  阅读(127)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示