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重要断点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现