5.Spring IOC 循环依赖问题源码深度剖析

Spring IOC 容器解决循环依赖问题主要涉及到几个关键的缓存和对象创建过程中的处理逻辑。以下是对循环依赖问题进行深度剖析的概述:

  1. 循环依赖的背景
    循环依赖发生在两个或多个Bean相互依赖对方,形成一个闭环。这可能是直接的,比如Bean A依赖Bean B,Bean B又依赖Bean A;或者是间接的,比如Bean A依赖Bean B,Bean B依赖Bean C,Bean C又依赖Bean A。循环依赖会导致在Bean创建过程中出现无限递归。

  2. Spring IOC容器中的缓存
    为了解决循环依赖,Spring使用了多个缓存来存储Bean的不同状态:

singletonObjects:存放完全初始化好的单例Bean。
earlySingletonObjects:存放原始的Bean对象(尚未填充属性),用于解决循环依赖。
singletonFactories:存放Bean工厂对象,用于生成Bean的早期引用。
3. Bean创建过程
当Spring容器创建一个Bean时,它会经历以下步骤:

实例化Bean:首先,容器会实例化Bean,此时Bean的属性还未被填充。
注册Bean的早期引用:实例化后,容器将Bean的早期引用(未填充属性的实例)注册到earlySingletonObjects和singletonFactories缓存中。
属性填充:然后,容器会填充Bean的属性,解析其他Bean的依赖。
初始化Bean:最后,Bean会被初始化,完成所有生命周期回调,然后被放入singletonObjects缓存中供后续使用。
4. 解决循环依赖的关键
当一个Bean在属性填充过程中需要引用另一个尚未完全初始化的Bean时,Spring容器会:

检查singletonFactories缓存,看是否可以获取到对方Bean的早期引用。
如果可以,容器会使用这个早期引用来完成当前Bean的属性填充,从而打破循环。
5. 源码分析
在DefaultSingletonBeanRegistry类的getSingleton方法中,Spring容器处理循环依赖的逻辑非常关键。如果尝试获取的Bean正在创建中(即在singletonObjects中不存在,但在earlySingletonObjects中存在),容器会尝试从singletonFactories获取早期引用,并将其放入earlySingletonObjects中,然后继续Bean的创建过程。

  1. 限制和例外
    Spring只能解决单例作用域的循环依赖问题。
    对于原型作用域的Bean,Spring无法解决循环依赖,会抛出BeanCurrentlyInCreationException异常。
  2. 总结
    Spring IOC容器通过使用缓存和对象工厂来处理循环依赖问题,确保了Bean的创建过程不会陷入无限循环。这种机制允许Bean在完全初始化之前,就可以被其他Bean引用,从而打破了循环依赖。

通过上述分析,我们可以看到Spring框架如何巧妙地解决了循环依赖问题,确保了容器的稳定性和Bean生命周期的正常管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球最大智能立体书库|北京:3万货位,715万册,自动出库、分拣、搬运

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 北京城市图书馆的立体书库采用了先进的WMS(仓库管理系统)和WCS(仓库控制系统),与图书…

Linux磁盘监控思路分析

磁盘监控原理 设备又名I/O设备,泛指计算机系统中除主机以外的所有外部设备。 1.1 计算机分类 1.1.1 按照信息传输速度分: 1.低速设备:每秒传输信息仅几个字节或者百个字节,如:键盘、鼠标等 2.中速设备&#xff1a…

leetCode.98. 验证二叉搜索树

leetCode.98. 验证二叉搜索树 题目描述 代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(n…

100张linux C/C++工程师面试高质量图

文章目录 杂项BIOSlinux开机启动流程内核启动流程网络编程网络编程流程tcp状态机三次握手四次断开reactor模型proactor模型select原理poll原理epoll原理文件系统虚拟文件系统文件系统调用阻塞IO非阻塞IO异步IO同步阻塞同步非阻塞IO多路复用进程管理进程状态程序加载内存管理MMU…

力扣(2024.06.30)

1. 81——搜索旋转排序数组2 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了旋转&#xff0c;使数组变为 [nums[k], n…

vue响应式原理细节分享

在讲解之前&#xff0c;我们先了解一下数据响应式是什么&#xff1f;所谓数据响应式就是建立响应式数据与依赖&#xff08;调用了响应式数据的操作&#xff09;之间的关系&#xff0c;当响应式数据发生变化时&#xff0c;可以通知那些使用了这些响应式数据的依赖操作进行相关更…

前端:多服务端接口资源整合与zip打包下载

项目需求 前端项目开发中,有一个页面需要去整合多个服务接口返回的数据资源,并且需要将这多个服务接口接口返回的数据进行资源压缩,最终打包成zip压缩包,并在客户端完成下载。 基本需求梳理如下, 实现思路 这个需求点其实本质上还是传统的“文件下载”功能需求,常见的例如…

Python使用defaultdict简化值为list的字典

原始代码&#xff1a; from typing import Dictrelated_objects_for_fetch: Dict[str, list] {}for key, value in [(k1, v1), (k1, v2), (k2, v2), (k3, v3), (k2, v2)]:if key not in related_objects_for_fetch:related_objects_for_fetch[key] []if value not in (value…

贪心问题(POJ1700/1017/1065)(C++)

一、贪心问题 贪心算法 贪心算法&#xff08;greedy algorithm&#xff09;&#xff0c;是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪&#xff0c;每一步行动总是按某种指标选取最优的操作。而且他目光短浅&#xff0c;总是只看眼前&#xff0c;并不考虑…

第三天:LINK3D核心原理讲解【第1部分】

第三天:LINK3D核心原理讲解 LINK3D学习笔记 目标 了解LINK3D velodyne64线激光雷达LINK3D质心点提取效果: 分布在车道与墙体的交界处。 课程内容 LINK3D论文精讲LINK3D聚合关键点提取代码讲解LINK3D描述子匹配代码讲解除了ALOAM的线特征、面特征,还有其他点云特征吗,是…

如何使用 Postgres 折叠您的堆栈 实现一切#postgresql认证

技术蔓延如何蔓延 假设您正在开发一款新产品或新功能。一开始&#xff0c;您的团队会列出需要解决的技术问题。有些解决方案您将自行开发&#xff08;您的秘诀&#xff09;&#xff0c;而其他解决方案您将使用现有技术&#xff08;可能至少包括一个数据库&#xff09;来解决。…

人工智能期末复习笔记(更新中)

分类问题 分类&#xff1a;根据已知样本的某些特征&#xff0c;判断一个新的样本属于哪种已知的样本类 垃圾分类、图像分类 怎么解决分类问题 分类和回归的区别 1. 逻辑回归分类 用于解决分类问题的一种模型。根据数据特征或属性&#xff0c;计算其归属于某一类别 的概率P,…

ComfyUI局部重绘的四种方式 (附件工作流在最后)

前言 局部重绘需要在图片中选择重绘区域&#xff0c;点击图片右击选择Open in MaskEditor&#xff08;在蒙版编辑器中打开&#xff09;&#xff0c;用鼠标描绘出需要重绘的区域 方式一&#xff1a;重绘编码器 这种方式重绘比较生硬&#xff0c;需要额外搭配使用才行 方式二&…

el-upload 上传图片及回显照片和预览图片,文件流和http线上链接格式操作

<div v-for"(info, index) in zsjzqwhxqList.helicopterTourInfoList" :key"info.id" >编辑上传图片// oss返回线上地址http链接格式&#xff1a;<el-form-itemlabel"巡视结果照片":label-width"formLabelWidth"><el…

Cyber Weekly #13

赛博新闻 1、谷歌发布最强开源小模型Gemma-2 本周五&#xff08;6月28日&#xff09;凌晨&#xff0c;谷歌发布最强开源小模型Gemma-2&#xff0c;分别为9B&#xff08;90亿&#xff09;和27B&#xff08;270亿&#xff09;参数规模&#xff0c;其中9B 模型在多项基准测试中均…

颍川韩氏,来自战国七雄韩国的豪族

颍川是战国七雄韩国故土&#xff0c;韩国被秦国灭国后&#xff0c;王公贵族们除了坚决反秦的被杀了外&#xff0c;大部分都留存了下来。这些人在楚、汉反秦战争中&#xff0c;成为反秦统一战线的重要力量&#xff0c;其中两人先后被封为重新恢复的韩国的国王。 一个是横阳君韩…

Windows系统下,将nginx注册为本地服【亲测可用】

在Windows系统下&#xff0c;将nginx注册为本地服务并设置为开机自动运行&#xff0c;可以通过以下步骤进行&#xff1a; 下载Windows Service Wrapper&#xff1a; 访问 WinSW 项目页面&#xff0c;下载适用于Windows的版本。 准备nginx&#xff1a; 确保你已经下载并解压了n…

共有5部手机,如果通过服务器让1号手机执行打开 “闲鱼.js“ 脚本

1.手机端Auto.js脚本&#xff1a; 每部手机需要在连接时发送一个唯一的标识符&#xff08;如设备ID&#xff09;&#xff0c;并接收服务器发送的指令以执行指定的脚本。 // Auto.js脚本连接WebSocket服务器并发送设备ID var WebSocket require(ws); var ws new WebSocket(w…

大模型上下文长度扩展中的检索增强技术简述

基于Transformer的语言模型在众多自然语言处理任务上都取得了十分优异的成绩&#xff0c;在一些任务上已经达到SOTA的效果。但是&#xff0c;经过预训练后&#xff0c;模型能够较好处理的序列长度就固定下来。而当前的众多场景往往需要处理很长的上下文&#xff08;如&#xff…

CppTest单元测试框架(更新)

目录 1 背景2 设计3 实现4 使用4.1 主函数4.2 使用方法 1 背景 前面文章单元测试之CppTest测试框架中讲述利用宏ADD_SUITE将测试用例自动增加到测试框架中。但在使用中发现一个问题&#xff0c;就是通过宏ADD_SUITE增加多个测试Suite时&#xff0c;每次运行时都是所有测试Suit…