Java面试八股之Spring如何解决循环依赖

  1. Spring如何解决循环依赖

在Spring框架中,循环依赖问题通常发生在两个或多个Bean相互依赖的情况下。Spring为了解决循环依赖问题,采用了不同的策略,这些策略主要取决于Bean的作用域以及依赖注入的方式。下面是一些关键点:

单例Bean的循环依赖

对于单例(Singleton)作用域的Bean,Spring采用了一种叫做三级缓存机制来解决循环依赖问题。这种机制涉及三个缓存:

一级缓存:singletonObjects,存储完全初始化完毕的Bean实例。

二级缓存:earlySingletonObjects,存储正在创建中的Bean的早期引用(Early Singleton)。

三级缓存:singletonFactories,存储正在创建中的Bean的工厂。

当Spring初始化一个Bean时,流程如下:

如果在singletonObjects(一级缓存)中找到了Bean实例,则直接返回。

否则,检查earlySingletonObjects(二级缓存),如果存在,则返回早期引用。

如果上述两步都未找到,则从singletonFactories(三级缓存)中获取工厂,创建Bean实例。

创建过程中,如果遇到依赖,会再次尝试从缓存中获取依赖的Bean实例。

如果依赖的Bean也在创建中,则将其早期引用放入earlySingletonObjects,然后返回给请求方继续执行初始化。

初始化完成后,将Bean实例放入singletonObjects,并从earlySingletonObjects和singletonFactories中移除。

构造器注入的循环依赖

对于通过构造器注入的循环依赖,Spring无法使用上述缓存机制来解决,因为构造器必须在创建对象时就提供所有参数,没有机会在创建过程中返回部分初始化的对象。在这种情况下,通常需要重构代码来打破循环依赖。

解决循环依赖的其他策略

除了上述机制,开发人员还可以采用以下策略来避免或解决循环依赖问题:

重构代码:重构代码以打破循环依赖,例如通过引入第三个Bean作为中介来传递信息。

使用@Lazy注解:将其中一个Bean标记为懒加载,这样它在真正需要时才被初始化,从而避免在启动时形成循环依赖。

构造器注入转为Setter注入:如果可行,可以将构造器注入改为setter注入,利用Spring的缓存机制。

使用自定义工厂方法:创建自定义的工厂Bean或工厂方法,以便更好地控制依赖关系的创建顺序。

总之,Spring通过其内部的缓存机制可以解决大部分基于setter注入的循环依赖问题,但对于构造器注入的循环依赖,通常需要代码层面的调整来解决。在设计系统架构时,应尽量避免复杂的循环依赖,以简化依赖管理和提高系统的可测试性和可维护性。

如果大家需要视频版本的讲解,欢迎关注我的B站:

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

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

相关文章

centos安装python 3.9

centos安装python 3.9 1. 准备工作 安装必要的构建工具和依赖项: sudo yum groupinstall "Development Tools" sudo yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel …

轻量级服务器资源监控平台Beszel

什么是 Beszel ? Beszel 是一个轻量级平台,借助 Beszel,可以访问 CPU 和内存使用情况的历史数据,以及 Docker 容器指标(例如特定于容器的 CPU 和内存统计信息)。还能收到针对潜在问题的可自定义警报通知&am…

【Golang 面试 - 进阶题】每日 3 题(八)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

基于Django与spark的国漫推荐系统

文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍每文一语 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主 项目介绍 近年来,随着互联网的蓬勃发展,企事业单位对信息的管理提…

C#知识|文件与目录操作:对象的创建、保存、读取

哈喽,你好啊,我是雷工! 面向对象编程的特点就是一切皆对象,操作的也是对象,本节学习文件与目录操作中,对象的保存; 以下为学习笔记。 01 对象的特点 ①:对象运行在内存中&#xff…

二刷代码随想录训练营Day 11| 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、总结

1.逆波兰表达式 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 代码&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st;for(int i 0; i < tokens.size(); i){if(tokens[i] "" || tokens[i…

vue里给img的src绑定数据失效

起因 在v-for遍历数据时想要通过给img的src单向绑定 图片路径时出现问题 解决过程 上网查说是webpack构建时识别不到&#xff0c;直接不单绑数据&#xff0c;写死试试看 解决方案 直接require导入图像文件模块

热门超声波清洗机有哪些?小型超声波清洗机推荐

在繁忙的工作和生活中&#xff0c;许多人常常会因为种种原因忽略日常的小事&#xff0c;比如忘记清洁手表、眼镜、首饰等常用物品。实际上&#xff0c;这些物品表面不仅积累了灰尘和污垢&#xff0c;特别是跟眼部朝夕相处的眼镜&#xff0c;还可能滋生各种致病细菌&#xff0c;…

【数据分享】《内蒙古省统计年鉴》2000-2023

而今天要限时免费分享的数据就是2000-2023年间出版的《内蒙古省统计年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 位于中国北部的内蒙古自治区&#xff0c;以其独特的地理和文化特性&#xff0c;成为中国经济发展的重要组成部…

京东科技集团将在香港发行与港元1:1挂钩的加密货币稳定币

据京东科技集团旗下公司京东币链科技(香港)官网信息&#xff0c;京东稳定币是一种基于公链并与港元(HKD) 1:1挂钩的稳定币&#xff0c;将在公共区块链上发行&#xff0c;其储备由高度流动且可信的资产组成&#xff0c;这些资产安全存放于持牌金融机构的独立账户中&#xff0c;通…

工具(1)—截屏和贴图工具snipaste

演示和写代码文档的时候&#xff0c;总是需要用到截图。在之前的流程里面&#xff0c;一般是打开WX或者QQ&#xff0c;找到截图工具。但是尴尬的是&#xff0c;有时候&#xff0c;微信没登录&#xff0c;而你这个时候就在写文档。为了截个图&#xff0c;还需要启动微信&#xf…

数据透视表(二)

文章目录 导入外部数据源创建数据透视表Query 工具下的数据透视表创建如何统计业绩成交情况创建组利用函数构建辅助列创建组手动创建多样分组创建组区间统计创建组按年月日统计数据透视表的多种统计方法计算字段 导入外部数据源创建数据透视表 点击数据选项卡下数据-获取外部数…

环境搭建-Windows系统搭建Docker

Windows系统搭建Docker 一、系统虚拟化1.1 启用虚拟化2.2 启用Hyper-v并开启虚拟任务 三、安装WSL3.1 检验安装3.2 安装WSL 四、Docker安装4.1 Docker安装包下载4.2 Docker安装4.3 运行docker Desktop 五、Docker配置5.1 打开Docker配置中心5.2 配置Docker国内镜像 六、使用 一…

马斯克的Memphis AI超级计算中心:全球最强AI训练集群的诞生

引言 近期&#xff0c;马斯克宣布其最新的Memphis AI超级计算中心正式启动&#xff0c;这一新闻引发了科技界的广泛关注。该中心配备了10万块液冷H100 GPU&#xff0c;成为全球最强大的AI训练集群。本文将深入探讨Memphis AI超级计算中心的建设过程、技术细节、以及其对未来人…

昇思25天学习打卡营第24天|基于MobileNetv2的垃圾分类案例:从数据准备到导出模型文件

目录 MindSpore 版本配置及相关数据集与预训练权重文件下载 基于 MindSpore 的垃圾分类数据集创建与配置 MobileNetV2 模型的构建与相关类定义 基于 MindSpore 的 MobileNetV2 模型训练与测试代码分析 基于 MobileNetV2 模型的图像推理代码分析 MobileNetV2 模型的构建、加…

C语言——设计TVM(地铁自动售票机)机软件。

输入站数&#xff0c;计算费用&#xff0c;计费规则&#xff0c;6站2元&#xff0c;7-10站3元&#xff0c;11站以上为4元。 输入钱数&#xff0c;计算找零(找零时优先找回面额大的钞票)&#xff0c;找零方式为各种面额张数&#xff0c;可识别面额&#xff1a; 100,50,20,10,5,1…

yandex图标点选验证码YOLOV8识别案例

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 某yandex图标点选验证码如下: 使用过yolov8的小伙伴可能都知道,这种直接打个标注,基本上就可以了,至于问题图片由于不能很好的切割做分类,所以干脆也做成目标…

[Bugku] web-CTF靶场详解!!!

平台为“山东安信安全技术有限公司”自研CTF/AWD一体化平台&#xff0c;部分赛题采用动态FLAG形式&#xff0c;避免直接抄袭答案。 平台有题库、赛事预告、工具库、Writeup库等模块。 ------------------------------- Simple_SSTI_1 启动环境&#xff1a; 页面提示传入参数f…

【Linux】make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

2024电赛H题参考方案(+视频演示+核心控制代码)——自动行驶小车

目录 一、题目要求 二、参考资源获取 三、TI板子可能用到的资源 1、环境搭建及工程移植 2、相关模块的移植 四、控制参考方案 1、整体控制方案视频演示 2、视频演示部分核心代码 五、总结 一、题目要求 小编自认为&#xff1a;此次控制类类型题目的H题&#xff0c;相较于往年较…