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

1、概述

spring中,存在A依赖B,同时B又依赖A的情况,这种情况下,spring如何进行bean初始化呢?

@Service
public class A {
    @Autowired
    private B b;
}

@Service
public class B {
    @Autowired
    private A a;
}

本文来解释这个问题。

2、spring的应对之道

2.1 三级缓存介绍

Spring 框架在解决单例 Bean 的循环依赖问题时,使用了三级缓存机制。这三级缓存分别是:

  • 一级缓存(singletonObjects)
  • 二级缓存(earlySingletonObjects)
  • 三级缓存(singletonFactories)

每级缓存都有其特定的作用,下面详细解释这三级缓存的作用:
1. 一级缓存(singletonObjects)
作用:存储完全初始化好的 Bean 实例。
特点:当一个 Bean 完全初始化并准备好使用时,会被放入 singletonObjects 缓存中。
访问时机:当其他 Bean 需要依赖这个 Bean 时,会直接从 singletonObjects 中获取。
2. 二级缓存(earlySingletonObjects)
作用:存储部分初始化的 Bean 实例。
特点:当一个 Bean 正在创建过程中,但还没有完全初始化完毕时,会被放入 earlySingletonObjects 缓存中。
访问时机:当其他 Bean 需要依赖这个正在创建中的 Bean 时,会从 earlySingletonObjects 中获取部分初始化的实例。
3. 三级缓存(singletonFactories)
作用:存储创建 Bean 的工厂对象。
特点:当一个 Bean 正在创建过程中,Spring 会将创建这个 Bean 的工厂对象放入 singletonFactories 缓存中。
访问时机:当其他 Bean 需要依赖这个正在创建中的 Bean 时,会从 singletonFactories 中获取工厂对象,并通过工厂对象获取部分初始化的实例

2.2 bean初始化过程

上述创建过程中有一些疑问:

  • 第三步的B依赖的是A1,A1是部分创建成功的,也就是B也是部分创建成功的,那为什么B能放在一级缓存中呢,放在一级缓存中意味着B是可以被使用的。
  • 第四步:A创建后,A1的状态是什么样的?
  • 第四步:B之前依赖的是A1,如何把依赖更新到A上的?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mindustry像素工厂服务器开服教程

1、购买后登录服务器(百度莱卡云游戏面板) 进入控制面板后会出现正在安装的界面,大约5分钟左右就能安装完成 2、等待服务器运行起来 等待正常运行时间的表变成灰色之后就可以连接游戏了 3、连接游戏 先复制服务器的地址,单击地址…

【fisco学习记录2】多群组搭建

说明 文档参考: 多群组部署 — FISCO BCOS 2.0 v2.11.0 文档 (fisco-bcos-documentation.readthedocs.io) 多群组搭建之前,先暂停之前的单群组,并删除: cd fisco bash nodes/127.0.0.1/stop_all.sh rm -rf nodes/ 实现图&…

又一款国产自动化测试平台,开源了!

“时间就是金钱,效率就是生命”,在当下的社会里不仅我们的生活节奏变得越来越快,软件研发上线的节奏也是如此。在如此快节奏的软件开发环境中,高质量的软件测试变得尤为重要。 为了提高测试的效率和质量,建设一个强大…

小北的技术博客:探索华为昇腾CANN训练营与AI技术创新——Ascend C算子开发能力认证考试(初级)

前言 哈喽哈喽友友们,这里是zyll~(小北)智慧龙阁的创始人及核心技术开发者。在技术的广阔天地里,我专注于大数据与全栈开发,并致力于成为这一领域的新锐力量。通过智慧龙阁这个平台,我期望能与大家分享我的技术心得,共同探索技术的无限可能。 Ascend C编程:小北的技术…

【大数据技术基础 | 实验二】Linux基础:常用基本命令和文件操作

文章目录 一、实验目的二、实验要求三、实验环境四、常用基本命令1、验证cd和pwd命令2、验证ls命令3、验证mkdir命令4、验证cp、mv和rm命令 五、Linux文件操作1、验证touch命令2、验证cat命令3、验证more命令 六、实验心得 一、实验目的 学会linux常用命令(cd,ls,pwd,mkdir,rm…

元器件行业常用软件推荐-加速度JSUDO

元器件行业中,工程师们会使用多种软件来辅助设计、仿真、布局、布线和验证等工作。以下是一些推荐的软件,它们在电子设计自动化(EDA)和集成电路(IC)设计领域中被广泛使用: Altium Designer&…

创建包含可导入浏览器信任的SSL自签名证书

问题:现在的三大浏览器,chrome、edge、firefox 一般都默认启用https检查,这就要求我们自建的局域网内的网址和其他诸如nextcloud、photoprism、tiddlywiki等应用也必须要有证书。解决方法是使用openssl自己生成一个。由此则会再衍生出一个问题…

计算机视觉之YOLO算法基本原理和应用场景

YOLO算法基本原理 整体流程 YOLO 将目标检测问题转化为一个回归问题。它将输入图像划分成多个网格单元,每个网格单元负责预测中心点落在该网格内的目标。对于每个网格单元,YOLO 预测多个边界框以及这些边界框中包含目标的类别概率。边界框通常由中心点坐…

(vue)a-upload上传文件后将结果展示图片

&#xff08;vue&#xff09;a-upload上传文件后将结果展示图片 亲测有效 项目背景&#xff1a;油气项目上传数字岩心图片 接口返回 控制台打印的info: 代码 <a-uploadname"file"list-type"picture-card"class"avatar-uploader":show-u…

LabVIEW如何实现高精度定时器

在LabVIEW中实现高精度定时器通常需要考虑以下几个方面&#xff1a;定时器的精度要求、操作系统的调度机制、硬件资源&#xff08;如计时器、触发器&#xff09;等。以下是几种常见的实现方式&#xff1a; ​ 1. 使用 Wait(ms) 或 Wait Until Next ms Multiple VI 这两个函数…

Docker-compose 单节点管理、consul 注册中心、registrator、template

consul是一个基于分布式的服务发现和配置管理工具。它具有快速构建分布式架构&#xff0c;提供服务发现和服务注册功能。consul职能&#xff1a;1、自动发现、注册&#xff1b;2、自动配置&#xff1b;3、自动更新 服务发现&#xff1a;自动检查网络中的服务&#xff08;如数据…

101、QT摄像头录制视频问题

视频和音频录制类QMediaRecorder QMediaRecorder 通过摄像头和音频输入设备进行录像。 注意: 使用Qt多媒体模块的摄像头相关类无法在Windows平台上进行视频录制&#xff0c;只能进行静态图片抓取但是在Linux平台上可以实现静态图片抓取和视频录制。 Qt多媒体模块的功能实现是依…

李沐团队发布Higgs-Llama-3-70B,角色扮演专用模型

前言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;在各个领域都展现出强大的能力&#xff0c;尤其是其在对话、写作、代码生成等方面的应用越来越广泛。然而&#xff0c;想要让 LLM 真正地融入人类社会&#xff0c;扮演各种角色&#xff0c;还需要具备更强大的角…

Qt媒体播放器实现

本文介绍Qt媒体播放器实现。 Qt应用程序有时会涉及到视频文件的播放&#xff0c;Qt提供了QVideoWidget类实现视频和音频的播放&#xff0c;本文基于QVideoWidget类实现一个简单的媒体播放器。 1.自定义类&#xff08;基于QVideoWidget类&#xff09; 由于Qt并未提供专门的控…

免费绘图软件全解析:让你的创意工作更加高效

在数字化时代&#xff0c;绘图软件已成为我们生活中不可或缺的一部分&#xff0c;无论是业余爱好者还是专业设计师。幸运的是&#xff0c;市面上有许多免费且功能强大的绘图软件可供选择。以下是我们为您精选的8款免费绘图软件&#xff0c;每一款都是精心挑选的&#xff0c;值得…

idea2024启动Java项目报Error running CloudPlApplication. Command line is too long.

idea2024启动Java项目报Error running CloudPlApplication. Command line is too long. 解决方案&#xff1a; 1、打开Edit Configurations 2、点击Modify options设置&#xff0c;勾选Shorten command line 3、在Edit Configurations界面下方新增的Shorten command line选项中…

Midjourney零基础学习

Midjourney学习笔记TOP08 Midjourney的各种参数设置 Midjourney的用户操作界面没有醒目的工具栏、属性栏&#xff0c;所有的操作都是通过调用各种指令和参数进行的。 【质量&#xff08;–quality&#xff09;】 质量&#xff1a;顾名思义就是生成图像的画面细节和品质。 Mid…

Android10 recent键相关总结

目录 初始化流程 点击Recent键流程 RecentsActivity 显示流程 RecentsModel 获取数据管理类 RecentsActivity 布局 已处于Recent界面时 点击recent 空白区域 点击返回键 recent组件配置 Android10 Recent 功能由 System UI&#xff0c;Launcher共同实现。 初始化流程 …

数据结构之顺序表——动态顺序表(C语言版)

静态顺序表我们已经实现完毕了&#xff0c;下来我们实现一下动态顺序表 静态链接&#xff1a;数据结构之顺序表——动态顺序表(C语言版) 首先来了解一下两个顺序表的差别 一、内存管理的灵活性 动态分配与释放&#xff1a;动态顺序表能够在运行时根据需要动态地分配和释放内存…

Prometheus+Grafana 监控 Kubernetes

文章目录 一、Prometheus介绍二、Prometheus组件与监控三、Prometheus基本使用&#xff1a;怎么来监控四、Kubernetes监控指标五、Prometheus的基本使用&#xff1a;部署1.基于docker部署prometheusgrafana2. 查看prometheus配置文件3. 监控Linux服务器3.1找到自己相应的系统去…