当前位置: 首页 > article >正文

Spring如何解决循环依赖?

一、Spring的三级缓存

关键就是提前暴露未完全创建完毕的Bean。
三级缓存来解决循环依赖:
一级缓存:用于存储完全初始化完成的单例Bean。
二级缓存:用于存储尚未完全初始化,但已实例化的Bean,用于提前暴露对象,避免循环依赖问题。
三级缓存:用于存储对象工厂,当需要时,可以通过工厂创建早期Bean(特别是为了支持AOP代理对象的创建)

二、Spring解决循环依赖流程

解决步骤:
1、Spring首先创建Bean实例,并将其加入三级缓存中(Factory);
2、当一个Bean依赖另一个未初始化的Bean时,Spring会从三级缓存中获取Bean的工厂,并生成Bean的代理对象;
3、代理对象存储二级缓存,解决循环依赖;
4、一旦所有依赖Bean被完全初始化,Bean将转移到一级缓存中。

三、Spring解决循环依赖流程(案例版)

带入案例,解决Spring的三级缓存解决循环依赖问题:
假设:A、B之间是两个循环依赖
1、一开始创造A的时候查询一级缓存(里面存成品),发现没找到则看二级缓存是否在创建中(有没有半成品)。都没有则需要创建A的bean,调用的是createBean。过程分别是实例化、属性注入、初始化。
2、A实例化之后往三级缓存加入一个A的getObject方法,这个就是解决循环依赖的关键。
3、到了属性注入,因为A依赖B因此需要创建B。同样的路线B也要createBean。不一样的也是解决循环依赖的一环:到了属性注入,查询二级缓存的A为创建中,则调用三级缓存的工厂getObject创建一个半成品的A,放入到二级缓存中,并完成B的第二步属性注入。
4、后面初始化initializeBean,完成B的Bean创建,放到一级缓存。
5、回到A刚刚卡在的属性注入,现在可以成功注入B,然后初始化,A也就完成了Bean创建。
(注:成品和半成品就是没有注入所需的依赖)


http://www.kler.cn/a/564229.html

相关文章:

  • 家用可燃气体探测器——家庭燃气安全的坚实防线
  • 文件跨国传输如何防丢包?重传机制解析
  • 自然语言处理(NLP):文本向量化从文字到数字的原理
  • Spring MVC视图解析器的定制与应用
  • java项目之基于ssm的线上旅游体验系统(源码+文档)
  • 论文阅读笔记:Deep Face Recognition: A Survey
  • vscode+vue前端开发环境配置
  • 几个api
  • 包子凑数——蓝桥杯真题Python
  • 如何利用爬虫技术测试淘宝商品详情接口
  • 修改CentOS 8 yum源
  • 2025年02月27日Github流行趋势
  • 国内短剧系统源码部署小程序体验测评讲解
  • WebRTC学习七:WebRTC 中 STUN 协议详解
  • 文档识别-C#中英文文档识别接口-PDF文件内容识别API
  • C# sizeof 关键字的使用
  • Python中if else以及嵌套
  • Java SSE流式数据前后端实现
  • 第2_3章_入门管理资源服务器
  • 定义数组存储3部汽车对象(class1)