Spring中解决循环依赖为什么要用三级缓存,二级为什么不行呢?

在Spring中解决循环依赖时,使用三级缓存是因为循环依赖的解决过程需要多个阶段的处理,并且需要保留中间状态。而使用二级缓存无法满足这些需求。

循环依赖是指两个或多个Bean之间相互依赖的情况,例如A依赖B,B又依赖A。为了解决循环依赖,Spring使用了三级缓存的机制。

三级缓存的工作流程如下:

  1. 第一级缓存(singletonObjects):用于存放完全初始化完成的Bean实例。

  2. 第二级缓存(earlySingletonObjects):用于存放尚未完全初始化的Bean实例。

  3. 第三级缓存(singletonFactories):用于存放创建Bean实例的ObjectFactory。

Spring使用了"提前暴露半成品Bean"的方式来处理循环依赖。

具体解决循环依赖的过程如下:

  1. 当容器创建一个Bean时,会首先将正在创建的Bean标记为"已创建但未初始化"状态。
  2. 然后,容器会将这个尚未完全初始化的Bean实例放入早期暴露的ObjectFactory中。
  3. 接下来,容器会开始处理Bean实例的属性注入。
  4. 如果在属性注入的过程中发现了循环依赖,Spring会从早期暴露的ObjectFactory中获取到尚未完全初始化的Bean实例,并将其提供给当前正在创建的Bean,以完成属性注入。
  5. 当属性注入完成后,容器会继续初始化当前的Bean实例。
  6. 在完成当前Bean实例的初始化后,容器会将其从第二级缓存中移除,并放入第一级缓存中,表示该Bean已经完全初始化完成。
  7. 接着,容器会检查第三级缓存中是否存在其他尚未完全初始化的Bean实例。如果存在,容器会递归处理这些Bean实例的属性注入和初始化过程,直到所有的循环依赖都得到解决。
  8. 需要注意的是,如果在处理循环依赖时出现了循环引用,即A依赖B,B又依赖A,并且无法通过构造函数注入解决循环依赖,Spring将抛出BeanCurrentlyInCreationException异常,以避免无限循环创建Bean实例。

总结起来,使用三级缓存的机制可以在Spring中解决循环依赖问题,通过提前暴露半成品Bean和多级缓存的方式,确保Bean的属性注入和初始化过程能够正确进行,并最终完成所有的循环依赖关系。

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

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

相关文章

Ae 效果:CC Kernel

颜色校正/CC Kernel Color Correction/CC Kernel CC Kernel(CC 卷积核)效果主要用于图像的卷积处理,通过在卷积矩阵中设置不同的权重值,可以实现图像的锐化 Sharpen、模糊 Blur、查找边缘 Find Edges以及浮雕 Emboss等效果。 ◆ …

服务调用---------Ribbon和Feign

目录​​​​​​​ 1、Ribbon 1.1 Ribbon简介 1.2 Ribbon负载均衡 负载均衡原理 负载均衡策略 Ribbon和Nginx的区别 1.3 服务调用和Ribbon负载均衡实现 2、Feign&openFeign 3、Feign支持的配置 日志功能 连接池 feign-api远程包 1、Ribbon 1.1 Ribbon简介 Ribb…

神经概率语言模型

本文主要参考《A Neural Probabilistic Language Model》这是一篇很重要的语言模型论文,发表于2003年。主要贡献如下: 提出了一种基于神经网络的语言模型,是较早将神经网络应用于语言模型领域的工作之一,具有里程碑意义。采用神经网络模型预测下一个单词…

源码阅读:classnames

源码阅读:classnames 源码阅读:classnames简介源码解读indexdedupebind类型声明 学习与收获 源码阅读:classnames 简介 classnames 一个简单的 JavaScript 实用程序,用于有条件地将类名连接在一起。 可以通过 npm 包管理器从 n…

【YOLO】模型推理(trt和engine)

【YOLO】模型推理(trt和engine) 上一章 yolov5+TensorRT推理 文章目录 【YOLO】模型推理(trt和engine)前言一、pt转onnx模型1.1 下载yolov51.2 模型导出二、Netron Viewer安装三、onnx转trt模型3.1 安装TensorRT3.2 模型转换四、执行推理4.1 推理五、模型量化FP16\INT85.1 性能…

05-向量的意义_n维欧式空间

线性代数 什么是向量?究竟为什么引入向量? 为什么线性代数这么重要?从研究一个数拓展到研究一组数 一组数的基本表示方法——向量(Vector) 向量是线性代数研究的基本元素 e.g. 一个数: 666,…

leetcode算法题--统计完全子数组的数目

原题链接:https://leetcode.cn/problems/count-complete-subarrays-in-an-array/ 一开始的做法比较简单粗暴,复杂度是O(n*n) func countCompleteSubarrays(nums []int) int {cnt1 : make(map[int]int)for _, num : range nums {cnt1[num] }count : len…

springboot整合tio-websocket方案实现简易聊天

写在最前: 常用的http协议是无状态的,且不能主动响应到客户端。最初想实现状态动态跟踪只能用轮询或者其他效率低下的方式,所以引入了websocket协议,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务…

实用上位机--QT

实用上位机–QT 通信协议如下 上位机设计界面 #------------------------------------------------- # # Project created by QtCreator 2023-07-29T21:22:32 # #-------------------------------------------------QT += core gui serialportgreaterThan(QT_MAJOR_V…

Unity实现在3D模型标记

Canvas 模式是UI与3D混合模式(Render modelScreen space-Camera) 实现在3D模型标记,旋转跟随是UI不在3D物体下 代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public clas…

矩阵中的路径(JS)

矩阵中的路径 题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是…

valgrind——内存泄漏检测介绍

文章目录 1. 概述1. 体系结构2. Linux 程序内存空间布局3. 内存检查原理 2. valgrind工具3. 常用选项4. 示例1. 内存泄漏2. 数组越界3. 内存覆盖4. 使用未初始化的值5. 内存申请与释放函数不匹配 5. 总结 1. 概述 1. 体系结构 Valgrind 是一套 Linux 下,开放源代码…

移动端个人中心UI设计

效果图 源码如下 页面设计 <template><div class"container"><!-- 顶部用户信息 start--><div class"header"><div class"user-info"><van-image class"user-img" round width"70" :sr…

Idea 2023.2 maven 打包时提示 waring 问题解决

Version idea 2023.2 问题 使用 Maven 打包 &#xff0c;控制台输出 Waring 信息 [WARNING] [WARNING] Plugin validation issues were detected in 7 plugin(s) [WARNING] [WARNING] * org.apache.maven.plugins:maven-dependency-plugin:3.3.0 [WARNING] * org.apache.…

HCIP--云计算题库 V5.0版本

在国家政策的支持下&#xff0c;我国云计算应用市场发展明显加快&#xff0c;越来越多的企业开始介入云产业&#xff0c;出现了大量的应用解决方案&#xff0c;云应用的成功案例逐渐丰富&#xff0c;用户了解和认可程度不断提高&#xff0c;云计算产业发展迎来了“黄金机遇期”…

【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段

在工作中可能会遇到这样的场景&#xff1a;有多个GDB要素、表格&#xff0c;或者是SHP文件&#xff0c;需要给这个要素或表添加相同的多个字段。 在这种情况下&#xff0c;手动添加就变得很繁琐&#xff0c;于是就做了这个工具。 需求具体如下图&#xff1a; 左图是待处理数据…

C数据结构——无向图(邻接矩阵方式) 创建与基本使用

源码注释 // // Created by Lenovo on 2022-05-13-上午 9:06. // 作者&#xff1a;小象 // 版本&#xff1a;1.0 //#include <stdio.h> #include <malloc.h>#define MAXSIZE 1000 // BFS队列可能达到的最大长度 #define MAX_AMVNUMS 100 // 最大顶点数typedef enu…

电脑剪辑视频的软件有哪些?试试这几种视频剪辑工具

视频剪辑可以帮助人们在不同情境下更好地理解和消化视频内容。通过剪辑&#xff0c;可以去除不必要的素材并突出重点&#xff0c;使观看者能够更快地获取信息&#xff0c;并且更容易保持注意力的集中。此外&#xff0c;剪辑可以提高视频质量&#xff0c;例如通过添加音乐、图形…

【shell脚本】shell脚本之日志切割(进阶实战三)

恭喜你&#xff0c;找到宝藏博主了&#xff0c;这里会分享shell的学习整过程。 shell 对于运维来说是必备技能之一&#xff0c;它可以提高很多运维重复工作&#xff0c;提高效率。 shell的专栏&#xff0c;我会详细地讲解shell的基础和使用&#xff0c;以及一些比较常用的she…

CVPR2023新作:源数据集对迁移学习性能的影响以及相应的解决方案

Title: A Data-Based Perspective on Transfer Learning (迁移学习的基于数据的观点) Affiliation: MIT (麻省理工学院) Authors: Saachi Jain, Hadi Salman, Alaa Khaddaj, Eric Wong, Sung Min Park, Aleksander Mądry Keywords: transfer learning, source dataset, dow…