spring三级缓存解决循环依赖原理

news/2024/10/6 21:07:42/文章来源:https://www.cnblogs.com/use-D/p/18290095

在Spring框架中,Bean的实例化和管理是通过其核心的IoC容器完成的。在处理Bean的依赖注入时,可能会遇到循环依赖的问题,即两个或多个Bean相互引用对方。为了解决这一问题,Spring采用了三级缓存机制。

一级缓存:singletonObjects

这是Spring IoC容器中的主要缓存,用于存放已经创建并完全初始化完毕的单例Bean。当一个Bean被请求时,Spring会首先从这个缓存中查找是否存在,如果存在则直接返回,避免了重复创建。

二级缓存:earlySingletonObjects

这是一个临时缓存,在Bean的创建过程中使用。当Bean的构造函数执行完毕,但尚未进行属性填充和初始化方法调用时,Bean会被暂时放入这个缓存中。这样,如果在这个阶段有其他Bean请求依赖于它,可以从这里获取到部分初始化的Bean实例,从而避免了循环依赖导致的异常。

三级缓存:singletonFactories

这是一个工厂缓存,存储的是Bean的Factory对象。当一个Bean正在被创建但还未完全初始化时,它的Factory对象会被放入这个缓存中。如果此时有其他Bean请求依赖于它,Spring会从这个缓存中获取Factory对象,并通过它来获取当前正在创建的Bean的一个部分初始化实例。

解决循环依赖的流程

  1. 当A依赖于B,B又依赖于A时,Spring在创建A的过程中,将A的Factory对象放入singletonFactories
  2. 当B创建时,尝试从singletonObjects获取A,由于A尚未完全初始化,所以获取不到,然后从earlySingletonObjectssingletonFactories中查找。
  3. singletonFactories中找到A的Factory对象,通过它创建A的部分初始化实例,并将这个实例放入earlySingletonObjects
  4. B现在可以使用A的部分初始化实例继续其自身的初始化过程。
  5. 同样的逻辑应用于A对B的依赖。
  6. 当A和B都完成了初始化后,它们会被移出earlySingletonObjects,放入singletonObjects,供后续的依赖注入使用。

通过这种方式,Spring能够优雅地处理循环依赖,确保Bean的正常创建和初始化。

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

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

相关文章

哪些方法可以将word导出为pdf格式?

在日常工作和学习中,我们经常需要将Word文档转换为PDF格式,以便更好地保存、分享和打印文件。PDF格式具有跨平台兼容性好、不易被篡改等优点,因此得到了广泛应用。那么Word如何转PDF呢?本文将介绍三种实用的word转pdf的方法,帮助读者轻松实现文档格式的转换。 方法一:使用…

2024春秋杯 stdout

考点:文件,setvbuf缓冲区,ret2syscall,ret2csu 题目给了libc文件。 main函数和vlun函数存在明显的栈溢出 int __cdecl main(int argc, const char **argv, const char **envp) {char buf[80]; // [rsp+0h] [rbp-50h] BYREFinit(argc, argv, envp);puts("where is my s…

怎么看时序图

时序图看法 从上到下,从左到右 看一个单位时间,拆分成一个一个模块 简单的时序图,一根线串口通信SPIS时序图总体传输24个bit注意无效电平可能传输不同的电平

工程仪器振弦采集仪的设计与研发进展

工程仪器振弦采集仪的设计与研发进展 工程仪器振弦采集仪是一种用于测量和记录物体振动参数的仪器。它能够实时采集物体的振动信号,并通过内部的传感器将振动信号转化为电信号,然后进行信号放大和处理,最终以数字形式显示或存储。 河北稳控科技振弦采集仪的设计与研发进展主…

近似排序......

一年没动算法的蒻蒟随手点开了之前做过的一道【近似排序】,然后开始了,恢复之旅......TFLSOJ【近似排序】 看到题目经简单分析后先写出了一种傻瓜解法,(可能叫 暴力??) #include<bits/stdc++.h> using namespace std; int x,y; int a[110]; int main(){cin>&g…

SMU Summer 2024 Contest Round 1

SMU Summer 2024 Contest Round 1 Dice and Coin 题意 给个 n 面骰子和一枚硬币,初始投骰子,若骰子的值在 1 到 \(K-1\) 之间则反复投硬币,硬币为正则该值翻倍,否则为 0 ,当值为 0 输掉游戏或者大于等于 \(K\) 时赢得游戏结束,问你可以赢得游戏的概率为多少。 思路 以 1 …

分布式事务最经典的七种解决方案

转载:后端 - 分布式事务最经典的七种解决方案 - 分布式事务 - SegmentFault 思否 随着业务的快速发展、业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构。随之而来就必然遇到分布式事务这个难题。 这篇文章首先介绍了相关的基础理论,然后…

江门数字化mes系统定制哪家好 珠海盈致mes系统服务商

对于江门数字化MES系统的定制服务,选择珠海盈致科技是一个不错的选择。珠海盈致科技是一家专业的智能制造解决方案提供商,具有丰富的数字化制造和MES系统定制经验。以下是选择珠海盈致科技的一些优势: 专业团队:珠海盈致科技拥有一支专业的团队,包括软件工程师、制造业专家…

python+anaconda环境搭建

一:下载安装 1、安装anaconda anaconda官网2、安装pycharm pycharm官网二:配置环境 1、找到anaconda安装位置在系统环境变量中添加如下信息打开DOS框,输入conda --version,出现如下信息说明配置成功三:创建虚拟环境 1、打开DOS框;输入(name表示自己虚拟环境的名称;versi…

Open-Sora1.2环境搭建推理测试

​引子 前阵子写了一篇Open-Sora1.0环境搭建&推理测试(Open-Sora1.0环境搭建&推理测试_自己搭建sora服务-CSDN博客,感兴趣的童鞋,请移步)。Open-Sora1.1发布的时候,撇了一眼新闻。后面一转头,忘记这个事情了。无意间翻到其开源网站上,发现2024.6.17发布1.2版本了…

04、组件介绍

k8s里的资源对象 在k8s里,yaml用来声明API对象的,那么API对象都有哪些? 可以这样查看资源对象 kubectl api-resources yaml使用缩进表示层次,缩进不允许使用tab,只能用空格,缩进空格数多少不要求,只要保证同一层级空格数一样多即可 使用 # 书写注释 数组(列表)是使用 …

代码随想录算法训练营第25天 | 491.递增子序列

491.递增子序列 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会超过15。 数组中的整数范围是…