Spring Bean 循环依赖

在Spring框架中,Bean的创建和管理是其核心功能之一。然而,在复杂的应用系统中,Bean之间可能会形成循环依赖(Circular Dependency),这种情况如果不加以妥善处理,将会导致Spring容器在初始化时抛出异常。本文将深入探讨Spring Bean循环依赖的概念、Spring的解决机制以及我们如何在开发中避免或处理循环依赖。

什么是循环依赖?

循环依赖指的是两个或多个Bean之间通过构造函数、Setter方法或字段注入相互依赖,形成一个闭环。例如,Bean A依赖于Bean B,同时Bean B又依赖于Bean A,这就构成了一个典型的循环依赖。

常见的循环依赖场景

  • 构造函数注入:最容易导致循环依赖的注入方式,因为构造函数是在Bean完全初始化之前调用的,如果此时Bean A需要注入Bean B,而Bean B的初始化又需要Bean A,就会陷入死循环。
  • Setter方法注入:相对构造函数注入而言,Setter方法注入可以通过延迟注入的方式解决循环依赖问题。
  • 字段注入:字段注入的处理方式与Setter方法类似,但通常不推荐使用,因为它破坏了依赖的明确性和可读性。

Spring如何解决循环依赖?

三级缓存

Spring容器通过三级缓存机制解决了基于Setter方法的单例Bean的循环依赖问题。这三级缓存分别是:

  1. 一级缓存(SingletonObjects):存储完全初始化好的Bean,即所有依赖注入都完成的Bean。
  2. 二级缓存(EarlySingletonObjects):存储早期暴露的Bean对象,这些对象已经完成了实例化,但尚未进行属性填充(即依赖注入未完成)。
  3. 三级缓存(SingletonFactories):存储的是ObjectFactory,用于生成Bean的早期引用,以便在需要时能够获取到Bean的早期实例(尚未填充依赖)。

当Spring容器检测到循环依赖时,它会利用三级缓存来提前暴露Bean的早期引用,从而解决依赖注入问题。

流程简述

  1. 当Spring容器需要创建Bean A时,会先检查一级缓存中是否已存在Bean A的实例,如果不存在,则继续。
  2. 接着,Spring会尝试创建Bean A的实例,并将其ObjectFactory加入到三级缓存中。
  3. 随后,Spring在填充Bean A的依赖时,如果发现依赖的Bean B尚未创建,则开始创建Bean B。
  4. 如果Bean B也依赖于Bean A(即出现循环依赖),此时Spring会从三级缓存中获取Bean A的ObjectFactory,调用其getObject方法获取Bean A的早期引用,并将其注入到Bean B中。
  5. 接着,Spring完成Bean B的剩余初始化过程,并将其加入到二级缓存中。
  6. 当Bean B的初始化完成后,Spring回到Bean A的初始化流程,从二级缓存中获取Bean B的实例,完成Bean A的依赖注入和剩余初始化工作。
  7. 最后,将Bean A的实例加入到一级缓存中,供后续使用。

 

 

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

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

相关文章

【秋招笔试题】小O的01矩阵

输入 2 2 01 10 10 01 2 01 01 11 00 输出 2 -1解析&#xff1a;此题看到数据范围&#xff0c;直接DFS暴力即可&#xff0c;暴力枚举每行每列是否需要翻转&#xff0c;因为翻转两次是没有意义的。 #include <iostream> #include <cstring> #include <algorithm…

vue3 tree组件slots特性实践

上一小节我们实现了SvgIcon组件来支持组件开发中用到字体图标的地方&#xff0c;并应用在了tree节点折叠、展开的图标上&#xff0c;本小节我们将其用到tree的插槽内容中&#xff0c;一起来学习基于Vue3 tsx的插槽用法吧~ 先看要实现的效果&#xff1a; 要实现的文档部分&…

C嘎嘎浅谈模板

这篇文章给大家介绍一下c嘎嘎内存管理和模板&#xff0c;那么我们直接进入正题 c/c的程序内存分布 这里的了解一下即可 new和delete的定义和操作 格式&#xff1a;类型* 对象名 new 类型&#xff1b; 数组(对象)定义格式&#xff1a;类型* 对象名 new 类型[元素个数]&…

【机器学习】智驭未来:机器学习如何重塑制造业的转型与升级

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习重塑制造业生产流程&#x1f338;预测性维护&#xff1a;减少停机时间&#xff0c;提高设…

简单快捷!Yarn的安装与使用指南

Yarn 是由 Facebook (现 Meta) 开发的包管理工具。 今天&#xff0c;我将介绍如何使用 Yarn。 目录 Yarn 的官方网站 关于安装 版本确认 开始一个新项目&#xff08;创建 package.json 文件&#xff09; 安装软件包 升级包 运行脚本 执行包的命令 卸载包 总结 Yarn 的…

【MySQL进阶之路 | 高级篇】简述Bin Log日志

1. 日志类型 MySQL有不同类型的日志文件&#xff0c;用来存储不同类型的日志&#xff0c;分为二进制日志、错误日志、通用查询日志和慢查询日志&#xff0c;这也是常用的4种。MySQL 8又新增两种支持的日志:中继日志和数据定义语句日志。使用这些日志文件&#xff0c;可以查看M…

exo-tinggrad 架构解析

目录 exo-tinggrad 架构解析 8B 模型配置 70B 模型配置 exo-tinggrad 架构解析 这个项目目录包含了一系列与Python相关的文件和文件夹,它们共同构成了一个可能的项目或库。这些文件和文件夹按照特定的命名和组织方式被放置在了一起,以便于管理、开发和维护。 tinygrad: 这…

解决:Nacos无法获取远程配置数据,导致项目启动各种配置异常

解决&#xff1a;Nacos无法获取远程配置数据&#xff0c;导致项目启动各种配置异常 一问题描述&#xff1a;1.项目pom依赖版本&#xff1a;2.bootstrap.yml配置信息3.远程配置&#xff1a;默认public命名空间4.启动报异常&#xff0c;显示没有配置数据源&#xff0c;实际远程已…

金字塔监督在人脸反欺骗中的应用

介绍 论文地址&#xff1a;https://arxiv.org/pdf/2011.12032.pdf 近年来&#xff0c;人脸识别技术越来越普及。在智能手机解锁和进出机场时&#xff0c;理所当然地会用到它。人脸识别也有望被用于管理今年奥运会的相关人员。但与此同时&#xff0c;人们对人脸欺骗的关注度也…

邦布带你从零开始实现图书管理系统(java版)

今天我们来从零开始实现图书管理系统。 图书管理系统 来看我们的具体的实现&#xff0c;上述视频。 我们首先来实现框架&#xff0c;我们要实现图书管理系统&#xff0c;首先要搭框架。 我们首先定义一个书包&#xff0c;在书包中定义一个书类和一个书架类&#xff0c;再定义…

51单片机15(直流电机实验)

一、序言&#xff1a;我们知道在单片机当中&#xff0c;直流电机的控制也是非常多的&#xff0c;所以有必要了解一些这个电机相关的一些知识&#xff0c;以及如何使用单片机来控制这个电机&#xff0c;那么在没有学习PWM之前&#xff0c;我们先简单的使用GPIO这个管脚来控制电机…

女人内裤怎么洗才是最干净?内衣裤洗衣机怎么样?哪个牌子更好?

最近刚好用到一款比较好用的洗内衣裤洗衣机&#xff01;如果你也和我一样有洗内衣裤烦恼的&#xff0c;或者可以看看&#xff01; 内衣裤作为贴身穿的衣服&#xff0c;我是不会把它和外衣一起清洗的&#xff0c;而家里面的大洗衣机已经担起了清洗外衣的工作&#xff01; 朋友们…

jdk的major version和minor version是啥意思?

写在前面 1&#xff1a;正文 major version是大版本号&#xff0c;minor version是小版本号&#xff0c;但目前minor version都是0&#xff08;也可能是我没有发现&#x1f605;&#xff09;&#xff0c;如jdk8就是52&#xff0c;如下表&#xff1a; 可以看到jdk版本号和ma…

优思学院:六西格玛黑带的价值仍在吗?

六西格玛自20世纪80年代由摩托罗拉提出以来&#xff0c;已经深刻地影响了全球的质量管理实践。六西格玛方法论中的一个关键角色就是“黑带”&#xff0c;这些人经过培训&#xff0c;能够领导问题解决项目。随着进入数字化时代&#xff0c;自动化和数据分析在商业运营中变得越来…

【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能

审核看清楚了 &#xff01; 这是以太坊测试网络&#xff01;用于学习的测试网络&#xff01;&#xff01;&#xff01; 有关web3 和区块链的内容为什么要给我审核不通过&#xff1f; 别人凭什么可以发&#xff01; 目标成果&#xff1a; 实现功能分析&#xff1a; 显示账户信…

第N8周:图解NLP中的注意力机制

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、前期知识储备 注意力机制是一种模拟人类大脑注意力分配方式的计算模型&#xff0c;它能够在处理大量信息时&#xff0c;聚焦于重要的部分&#xff0c;而忽…

打卡第二十五天:递增子序列、全排列、全排列II、重新安排行程、N皇后、解数独

1、递增子序列 题目 文章 视频 这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。在子集一题中通过排序&#xff0c;再加一个标记数组来达到去重的目的。而本题求自增子序列&#xff0c;是不能对原数组进行排序的&#xff0c;排完序的数组都是自…

数据结构:(1)线性表

一、基本概念 概念&#xff1a;零个或多个数据元素的有限序列 元素之间是有顺序了。如果存在多个元素&#xff0c;第一个元素无前驱&#xff0c;最后一个没有后继&#xff0c;其他的元素只有一个前驱和一个后继。 当线性表元素的个数n&#xff08;n>0&am…

NzN的C语言全解析--C语言常见概念

目录 1. C语言是什么&#xff1f; 2. C语言的历史 3. 编译器的选择--VS2022 (1) 编译和链接 (2) VS2022 的优缺点 4. VS项目和源文件、头文件介绍 5. 第一个C语言程序 6. main函数 7. printf和库函数 8. 关键字 9. 字符和ASCII编码 10. 字符串和\0 11. 转义字符 …

文件系统基础(一)

目录 一 . 文件的基本概念文件的结构文件的属性文件的分类 二. 文件控制块和索引节点文件控制块&#xff08;FCB&#xff09;索引节点磁盘索引节点内存索引节点 三. 文件的操作文件的基本操作文件的打开与关闭文件打开文件关闭文件名与文件描述符的应用 四. 文件的保护访问类型…