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

Spring 如何处理循环依赖

在 Spring 框架里,循环依赖指的是多个 Bean 之间相互依赖,从而形成一个闭环。例如,Bean A 依赖 Bean B,而 Bean B 又依赖 Bean A。Spring 主要通过三级缓存机制来处理循环依赖,下面详细介绍相关内容。


1. 三级缓存的定义

  • 一级缓存(singletonObjects):这是一个 Map,用于存放已经完全初始化好的单例 Bean,这些 Bean 可以直接使用。
  • 二级缓存(singletonFactories):同样是一个 Map,用于存放提前暴露的单例 Bean 工厂,这里的 Bean 处于创建过程中,还未完成初始化。
  • 三级缓存(earlySingletonObjects):也是一个 Map,用于存放提前暴露的单例 Bean,这些 Bean 只是实例化了,但未完成属性注入和初始化操作。

2. 处理循环依赖的过程

  • 创建 Bean A:当需要创建 Bean A 时,Spring 会先将 Bean A 的创建工厂放入三级缓存 singletonFactories 中,然后开始进行 Bean A 的实例化操作。
  • 属性注入:在对 Bean A 进行属性注入时,发现它依赖于 Bean B,于是 Spring 开始创建 Bean B。
  • 创建 Bean B:如同创建 Bean A 一样,Spring 先把 Bean B 的创建工厂放入三级缓存 singletonFactories 中,接着实例化 Bean B。
  • 属性注入:在对 Bean B 进行属性注入时,发现它依赖于 Bean A。此时,Spring 会从三级缓存 singletonFactories 中获取 Bean A 的创建工厂,通过该工厂提前获取到 Bean A 的早期引用,并将其放入二级缓存 earlySingletonObjects 中,同时从三级缓存 singletonFactories 中移除 Bean A 的创建工厂。
  • 完成 Bean B 的创建:将从二级缓存 earlySingletonObjects 中获取到的 Bean A 的早期引用注入到 Bean B 中,然后完成 Bean B 的属性注入和初始化操作,最后将 Bean B 放入一级缓存 singletonObjects 中。
  • 完成 Bean A 的创建:由于 Bean B 已经创建完成,将其注入到 Bean A 中,接着完成 Bean A 的属性注入和初始化操作,最终把 Bean A 放入一级缓存 singletonObjects 中。

相关文章:

  • Superduper开源程序:在现有数据基础设施和首选工具上构建端到端 AI 应用程序和代理工作流 - 无需迁移数据
  • 阿里云国际站代理商:物联网设备怎样就近接入计算节点?
  • CSS3学习教程,从入门到精通,CSS3 定位布局页面知识点及案例代码(18)
  • 高光谱工业相机+LED光源系统助力材料分类和异物检测、实现高速在线检测
  • Excel新增的函数
  • JVM
  • Python大数据方向就业
  • 3-25hash专训
  • php写入\查询influxdb数据
  • HCIP NOTE_01_基础概念
  • GitHub和Gitee上的一些AI项目
  • springboot使用netty做TCP客户端
  • 使用Github项目nghttp2的样例学习HTTP/2
  • 【STM32】知识点介绍二:GPIO引脚介绍
  • stm32 外部中断实现
  • 26考研——图(6)
  • kafka学习
  • 登录验证码的接口实习,uuid,code.
  • 数据结构十五、排序
  • 【计算机网络编码与调制】
  • 做的网站怎么联网/百度收录网站需要多久
  • 科技公司网站首页/广州优化疫情防控举措
  • 建筑网站源码/百度竞价排名正确解释
  • 折纸效果网站/2024年新闻时事热点论文
  • 电商网站开发 知乎/网络培训平台有哪些
  • 网站建设一个多少钱/登录百度