Spring是如何解决bean循环依赖的问题的

news2024/11/27 16:38:30

在Spring框架中,循环依赖是指两个或多个Bean之间相互依赖,形成了一个闭环的依赖关系。当存在循环依赖时,Bean的创建过程会陷入死循环,导致应用程序无法启动或出现异常。

说到循环依赖,首先我先说说bean的三级缓存

在Spring框架中,Bean的三级缓存是指在Bean的创建过程中,Spring容器为了提高性能而采用的一种缓存机制。这个缓存机制包括三个级别的缓存,分别是singletonObjects、earlySingletonObjects和singletonFactories。

  1. singletonObjects:这是最终的单例对象缓存。当一个Bean的创建过程完成后,它会被放入singletonObjects缓存中。以后如果再次请求获取该Bean,Spring将直接从singletonObjects缓存中返回已经创建好的实例。

  2. earlySingletonObjects:这是早期的单例对象缓存。在Bean的创建过程中,当依赖关系解析完成但还未完成初始化时,Bean会被放入earlySingletonObjects缓存中。这样,当其他Bean需要引用该Bean时,可以提前获取到它的引用,避免循环依赖的问题。

  3. singletonFactories:这是用于存储Bean工厂的缓存。当Bean正在创建过程中,它的工厂方法会被放入singletonFactories缓存中。这样,在工厂方法被调用时,可以直接从缓存中获取工厂实例,而不需要重新创建。

通过使用三级缓存,Spring能够有效地管理Bean的创建过程和依赖关系,提高应用程序的性能和效率。这种缓存机制在单例作用域的Bean中特别有用,因为单例Bean在整个应用程序中只会被创建一次,而且可能存在循环依赖的情况。

需要注意的是,三级缓存的使用是为了提高性能和解决循环依赖问题,而不是为了缓存大量的Bean实例。因此,对于非单例作用域的Bean,Spring不会使用三级缓存,而是每次请求都会创建一个新的实例。

看完了三级缓存,大概都知道循环依赖怎么解决的,那我们来具体看一下策略吧

为了解决循环依赖问题,Spring使用了三级缓存和"提前暴露对象"的策略。下面是Spring解决循环依赖问题的大致过程:

  1. 创建Bean对象:当Spring容器需要创建一个Bean时,会先检查singletonObjects缓存中是否已经存在该Bean的实例。如果存在,则直接返回实例;如果不存在,则继续下一步。

  2. 提前暴露对象:在Bean的创建过程中,当依赖关系解析完成但还未完成初始化时,Spring会将当前Bean实例提前暴露给其他正在创建的Bean。这样,其他Bean可以提前获取到该Bean的引用,避免循环依赖的问题。

  3. 三级缓存处理:当发现循环依赖时,Spring会使用三级缓存来处理。首先,将正在创建的Bean工厂方法放入singletonFactories缓存中。然后,继续创建Bean的依赖关系,并将已经解析完成的依赖放入earlySingletonObjects缓存中。最后,完成Bean的创建并放入singletonObjects缓存中。

  4. 依赖注入:当所有Bean的创建过程完成后,Spring会执行依赖注入操作,将Bean的依赖关系注入到对应的属性中。

通过以上步骤,Spring能够解决循环依赖问题。它通过提前暴露对象和三级缓存的机制,在Bean的创建过程中合理处理依赖关系,确保循环依赖时能够正确地获取到已经创建好的实例或工厂方法,从而避免死循环的情况发生。

需要注意的是,Spring对于构造函数注入的循环依赖无法解决,因为在构造函数阶段无法提前暴露对象。对于这种情况,可以考虑使用Setter方法注入或通过引入一个中间层来解决循环依赖。

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

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

相关文章

【windows 脚本】netsh命令

netsh 是 Windows 操作系统中的一个命令行工具,用于配置和管理网络设置。它提供了一系列的命令和参数,可以用于配置网络接口、防火墙、路由表等网络相关的设置。以下是一些常用的 netsh 命令和用法: 配置静态IP,IP地址、子网掩码和…

python画图之颜色标尺

目录 带有颜色标尺的散点图带有颜色标尺的热图显示具体数值不显示具体数值 带有颜色标尺的轮廓图 在画图的时候加上颜色标尺可以非常方便看出数据的动态变化。以下是几个使用Python中常见的数据可视化库(Matplotlib和Seaborn)创建带有颜色标尺的图表的示…

震惊! 全方位解释在测试眼里,什么是需求?为什么要有需求?深入理解需求——图文并茂,生活举例,简单好理解

1、什么是需求? 需求定义(官方) 满足用户期望或正式规定文档(合同、标准、规范)所具有的条件和权能,包含用户需求和软件需求 用户需求:可以简单理解为甲方提出的需求,如果没有甲方,那么就是终端…

阿里云创建站点后如何制作网站

前言 链接: 如何用云服务器搭建网站、多个站点(不使用域名仅用公网IP) 这是之前我所写的如何利用阿里云服务器搭建站点,那么这篇文章就继续教大家如何制作网站,也算不上制作吧,就是导入网站模板。 文章目录 前言1.准备…

至高直降3000元,微星笔记本双11爆款推荐、好评有礼拿到手软

今年双11来的更早一些,微星笔记本先行的第一波雷影17促销活动,就已经领略到玩家们满满的热情。开门红高潮一触即发,微星笔记本双11活动周期至高直降3000元,众多爆款好货已经开启预约预售:有硬核玩家偏爱的性能双雄&…

【WinForm详细教程三】WinForm中的NumericUpDown、PictureBox、RichTextBox及三种Timer控件

文章目录 1. NumericUpDown2. PictureBox3.RichTextBox控件4. Timer 、System.Timers.Timer和System.Threading.Timer 计时器4.1 Timer4.2 System.Timers.Timer4.3 System.Threading.Timer 1. NumericUpDown NumericUpDown 控件是一个用于数字输入和显示的控件,通常…

freeRTOS学习day5

测试demo 创建两个任务 任务一 按键按下 释放二值信号量 任务二获取 并打印执行次数 #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "FreeRTOS.h" #include "task.h" #in…

iis前端代理后台tomcat

1)tomcat服务器配置运行好,服务地址位于 localhost:8080/wechat 2)iis 绑定了域名 api.abc.com 希望访问 api.abc.com/wechat时,实际由tomcat的服务处理; 3)iis上需要添加组件 requestRouter_amd64.msi rewrite_amd64_zh-CN.msi 4)iis进行相关配置…

皮卡搜索-阿里夸克百度网盘资源超级搜索引擎

https://www.pikaso.top INDEX_SEARCH_CTA 少儿 小学 初中 高中 大学 四六级 考研 考公 教资 英语 电影 动漫 美剧 软件 电子书 编程 剪辑 设计 聚合云盘搜索接口地址:https://www.pikaso.top/search/?q%s% 阿里云盘搜索接口地址:https://www.pikaso.…

博彦科技:以金融为起点,凭借创新技术平台真打实干

【科技明说 | 重磅专题】 成立于1995年的博彦科技,已有28年左右的发展历程。 我没有想到,博彦科技也对AIGC领域情有独钟。博彦科技自研的数字人产品SaaS平台,可以接入包括百度文心一言、阿里通义千问等AI大模型产品。可见&#…

8.多线程之阻塞队列

阻塞队列和生产者消费者模型 文章目录 阻塞队列和生产者消费者模型1. 阻塞队列2. Java标准库中的阻塞队列 - BlockingQueue3. 阻塞队列的实现4. 生产者消费者模型 1. 阻塞队列 阻塞队列是什么呢?阻塞队列是一种特殊的队列,满足队列的基本要求 - 先进先出…

CMake学习教程(一)

前言 看到陈皓大神写作的《跟我一起写 Makefile》,我也想出一个CMake学习的专栏。 距离我接触CMake已经过了3年,那是我还是研一,不懂得底层编译的事情,因为导师的项目才突然转到这个方向(项目是做工业软件的&#xf…

问题 R: 超级楼梯(递推,基础DP)查表

得到递推表达式: f(1)0,因为开始就站在第1级台阶上; f(2)1,只能从第1级台阶上1级; f(3)2,只能从第1级台阶上2级,或只能从第2级台阶上1级; f(n)f(n-2)f(n-1),n>3 …

Linux学习第25天:Linux 阻塞和非阻塞 IO 实验(二): 挂起

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 为方便和上一节的衔接,在正式开始学习前,先把本节的思维导图引入: 二、阻塞IO实验 1.硬件原理图分析 2.实验程序 #define I…

Linux两条服务器实现相互免密登录

1.准备两台虚拟机,一台充当服务器端(server),一台充当客户端(client) 服务器端(server):192.168.75.139 客户端(client):192.168.75…

腾讯云和阿里云双11优惠大战,服务器价格相差1块钱?

2023双十一优惠活动来了,同配置轻量应用服务器2核2G3M带宽,阿里云87元一年,腾讯云88元一年,阿里云不限制月流量,腾讯云限制200GB月流量,阿里云系统盘是50GB高效云盘,腾讯云是40GB SSD云硬盘&…

redis6.0源码分析:跳表skiplist

文章目录 前言什么是跳表跳表(redis实现)的空间复杂度相关定义 跳表(redis实现)相关操作创建跳表插入节点查找节点删除节点 前言 太长不看版 跳跃表是有序集合zset的底层实现之一, 除此之外它在 Redis 中没有其他应用。…

LED主流光源-高均匀条形光源

(1)产品特点: ① 高均匀条形照明光源,可制作长度最长为 2000mm 的光源; ② 可用 M3 螺纹孔安装,也可以在三个挤型槽内插入 M3 螺母安装。 (2)应用领域: ① 电子元件识别与…

掌握Python:开启未来的大门

Python,一门以其简洁性和多才多艺而著称的编程语言,正成为未来的关键技能之一。随着数字时代的到来,Python的发展前景愈发广泛,而且其易学性吸引着越来越多的学习者。 1.Python的发展前景: Python在数据科学、人工智能…

任正非说:我们要改善和媒体的关系,而不是要利用媒体,不要自以为聪明。

嗨,你好!这是华研荟【任正非说】系列的第22篇文章,让我们继续聆听任正非先生的真知灼见,学习华为的管理思想和管理理念。 一、我曾经在与一个世界著名公司,也是我司全方位的竞争对手的合作时讲过,我是拉宾的…