Spring是如何解决循环依赖问题的?

目录

  • 问题介绍
  • 什么是Spring中的三级缓存?
  • Spring中的三级缓存是如何解决循环依赖问题的?
  • 解决Spring循环依赖问题一定需要第三级缓存吗?
  • 解决Spring循环依赖问题一定需要第二级缓存吗?
  • 什么场景下的Spring循环依赖问题无法解决?
    • 采用了构造器的注入方式
    • 相互依赖的bean都是原型bean
    • 采用@DependsOn注解而导致的循环依赖
    • 使用了@Async注解
  • 如何解决构造器注入的循环依赖?
  • @Lazy是如何解决Spring循环依赖问题的?

问题介绍

注意这个问题与JVM中垃圾回收时的循环依赖问题进行区分。

JVM中垃圾回收时的循环依赖问题可以参考这篇博客中的垃圾回收部分。

Spring中的循环依赖问题是指IOC的加载过程当中bean创建的时候发生的,如下图所示,比如说当我们IOC加载创建BeanA的时候首先会去实例化A,然后进行属性注入解析@Autowired注解,发现依赖一个BeanB,这个时候会去IOC容器中帮我们去找BeanB,如果没有找到那么同样会先实例化B,然后进行属性注入解析@Autowired注解又发现依赖BeanA,这个时候又去IOC容器当中去拿BeanA,然后又没有拿到,又会去帮我们创建BeanA,就形成了一个闭环死循环。

答案:Spring则通过三级缓存来解决循环依赖问题。

循环典型的场景有以下三种:1.自我依赖。2.相互依赖。3.多个bean之间的依赖。比如A依赖B,B依赖C,…,而N又依赖A。

请添加图片描述

正常我们在创建Bean的时候完全可以通过先创建A和B两个对象的方法解决循环依赖,但是Spirng在创建非懒加载单例bean的时候出现循环依赖的问题是因为Spring的对象创建过程分为创建对象——实例化——属性填充三个过程。

请添加图片描述



什么是Spring中的三级缓存?

为了解决循环依赖问题,Spring 引入了三级缓存。那么,什么是 Spring 的三级缓存呢?首先,让我们看一下它们在DefaultSingletonBeanRegistry类中的定义,其实它们本质上就是一个Map。

请添加图片描述

—级缓存

一级缓存被命名为singletonObjects,也被称作单例池,它存储的是经历了完整的创建过程的单例 bean对象。一级缓存是一个ConcurrentHashMap,它的 key是String 类型,保存的是beanName; value 是Object 类型,保存的创建好的单例bean对象。

单例池并非专门用于解决Spring 的循环依赖问题,即便不考虑循环依赖,经历了Spring容器完整创建过程的单例 bean对象也会被放进该单例池。只不过在Spring解决循环依赖问题的三级缓存中被称为一级缓

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

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

相关文章

代码随想录算法训练营DAY7| C++哈希表Part.2|LeetCode:454.四数相加II、383.赎金信、15. 三数之和、18.四数之和

文章目录 454.四数相加II思路C代码 383.赎金信C 代码 15. 三数之和排序哈希法思路C代码 排序双指针法思路去重C代码 18.四数之和前言剪枝C代码 454.四数相加II 力扣题目链接 文章链接:454.四数相加II 视频链接:学透哈希表,map使用有技巧&…

工业物联网关的应用及相关产品-天拓四方

随着科技的飞速发展,智能制造业已成为工业领域的转型方向。在这一转变中,工业物联网关发挥着至关重要的作用。作为连接物理世界与数字世界的桥梁,工业物联网关不仅实现了设备与设备、设备与云平台之间的互联互通,更通过实时数据采…

0.96寸OLED屏调试 ----(四)

所需设备: 1、USB 转 SPI I2C 适配器;内附链接 2、0.96寸OLED显示模块; 备注:专业版、升级版都适用; 继续我们OLED模块的熟悉 : 指令详解 基础指令 1.设置对比度 (81HA[7:0])  …

兼顾陪读|本科学历律师自费赴美国加州大学伯克利分校访学

S律师拟陪同孩子赴海外就读,决定以访问学者身份,申请美国J类签证出国以兼顾陪读。因本科学历,无文章且有地域要求,自己申请无果后做了全权委托。为此我们酌情制定了三条申请策略,最终落实加州大学伯克利分校的访学职位…

AI大模型学习——AI领域技术发展

目录 前言 一、AI大模型学习的理论基础 二、AI大模型的训练与优化 三、AI大模型在特定领域的应用 四、AI大模型学习的伦理与社会影响 五、未来发展趋势与挑战 总结 前言 在当前技术环境下,AI大模型学习不仅要求研究者具备深厚的数学基础和编程能力&#xff…

鸿蒙打包so及引用

一、打包so 1. 环境,DevEco Studio3.1 2. 创建c工程 创建完成后,如下图: 3. 打包so 先配置 然后 二、引用so 1. 新建普工项目 2. 在src同一层级下创建libs文件夹,将so文件拷入 3. 将c工程中的侧接口文件及声明文件复制到项目…

协程库-锁类-实现线程互斥同步

mutex.h:信号量,互斥锁,读写锁,范围锁模板,自旋锁,原子锁 锁 **锁不能进行拷贝操作:**锁是用于管理多线程并发访问共享资源的同步原语。这些锁包括互斥锁(mutex)、读写锁…

AI智能分析网关V4使用GB28181注册到EasyCVR平台的具体步骤

旭帆科技的智能分析网关V4内含近40种智能分析算法,包括人体、车辆、消防、环境卫生、异常检测等等,在消防安全、生产安全、行为检测等场景应用十分广泛。如常见的智慧工地、智慧校园、智慧景区、智慧城管等等,还支持抓拍、记录、告警、语音对…

小黑的Vue前端之路:js中通过构造函数封装,设置对象getter和setter方法

js中构造函数创建对象 JavaScript本身并不是设计成面向对象的,所以没有class之类的关键字用来定义类,但JavaScript本身相当灵活,可以利用function关键字来定义类并创建对象。 例如js创建person对象 通过new关键字,把函数当成了创建对象的构造函数 function Pers…

某康安全开发工程师一面

一、反射型XSS跟DOM型XSS的最大区别 DOM型xss和别的xss最大的区别就是它不经过服务器,仅仅是通过网页本身的JavaScript进行渲染触发的。 二、Oracle数据库了解多吗 平常用的多的是MySQL数据库,像Oracle数据库也有了解,但是用的不多。 三、…

Fastjson反序列化漏洞原理与漏洞复现(基于vulhub靶场)

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

【码银送书第十五期】一本书掌握数字化运维方法,构建数字化运维体系

前言 数字化转型已经成为大势所趋,各行各业正朝着数字化方向转型,利用数字化转型方法论和前沿科学技术实现降本、提质、增效,从而提升竞争力。 数字化转型是一项长期工作,包含的要素非常丰富,如数字化转型顶层设计、…

macOS Sonoma 14.4.1 (23E224) 正式版发布,ISO、IPSW、PKG 下载

macOS Sonoma 14.4.1 (23E224) 正式版发布,ISO、IPSW、PKG 下载 2024 年 3 月 26 日凌晨,macOS Sonoma 14.4.1 更新修复了一个可能导致连接到外部显示器的 USB 集线器无法被识别的问题。它还解决了可能导致 Java 应用程序意外退出的问题,并修…

Linux Sftp和Scp

scp 和 sftp 区别 1 scp 能将远程文件复制到另一个远程机,sftp 不能。sftp为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式 2.scp 没有删除/创建远程目录功能,sftp 有。scp 在需要进行验证时会要求你输入密码或口令。 3. FT…

Docker部署一个SpringBoot项目(超级详细)

注意:下面的教程主要是针对 Centos7 的,如果使用的其他发行版会有细微的差别,请查看官方文档。 Docker部署一个SpringBoot项目(超级详细) 一、安装Docker1.卸载旧版2.配置Docker的yum库3.安装Docker4.设置开机自启动5.…

通过一篇文章让你了解如何学习C++

如何学习C 前言一、如何学习C二、别人是怎么学C的21天学会C编程能力与编程年龄 三、自己怎么学总结 前言 学习C需要掌握其基础语法、指针和内存管理、STL库使用、面向对象编程等核心概念。可通过阅读权威书籍、在线教程和参考官方文档来系统学习。实践是关键,通过…

网络编程基本概念(一篇文章掌握基本内容的详细概念,IP,端口号,协议,协议分层,封装和分用,客户端和服务端,请求和回应,两台主机的通信)

IP地址 概念 IP地址主要⽤于标识⽹络主机、其他⽹络设备(如路由器)的⽹络地址。简单说,IP地址⽤于定位主机的⽹络地址。 就像我们发送快递⼀样,需要知道对⽅的收货地址,快递员才能将包裹送到⽬的地。 IP的格式 IP地址…

自动化面试常见算法题!

1、实现一个数字的反转,比如输入12345,输出54321 num 12345 num_str str(num) reversed_num_str num_str[::-1] reversed_num int(reversed_num_str) print(reversed_num) # 输出 54321代码解析:首先将输入的数字转换为字符串&#xff…

systemd-journal(三)之systemd.journal-fields

文章目录 写在前面概述用户日志字段(User Journal Fields)MESSAGEMESSAGE_IDPRIORITYCODE_FILE, CODE_LINE, CODE_FUNCERRNOINVOCATION_ID, USER_INVOCATION_IDSYSLOG_FACILITY, SYSLOG_IDENTIFIER, SYSLOG_PID, SYSLOG_TIMESTAMPDOCUMENTATIONTIDUNIT, …

渗透测试——分享几个我常用渗透网站

前言 经常有小伙伴问我常用的渗透网站有哪些,花点时间整理出来,废话不多说,直接上网站。 一、雨苁 雨苁 这个网站从我接触网络安全一直在用,里面有几个很有用的工具如:在线地图情报搜集,开源情报信息收集…