Spring三级缓存解决循环依赖问题

news2024/11/19 13:26:31

一、Bean对象的创建过程

一般的Bean对象如下:首先通过构造器构造一个普通对象,然后进行依赖注入,再进行一些初始化操作,初始化后根据AOP生成代理对象,最后再放入单例池map,这个单例池map就是一级缓存。
在这里插入图片描述

二、循环依赖问题

但是如果A的普通对象在依赖注入时用到了其它Bean对象,则要去单例池中进行查找,如果没有则也要进行创建,如果这个Bean反过来又依赖了A的Bean对象,那么这就构成了循环依赖。

三、三级缓存解决循环依赖

SpringBoot中是通过三级缓存来解决循环依赖的,这三级缓存都是一个Map:

  1. 一级缓存singletonobjects:就是前面的单例池map,用于存储已经创建完成的Bean对象。
  2. 二级缓存earlySingletonObjects:用于缓存提前创建的Bean对象。
  3. 三级缓存singletonFactories:用于缓存提前创建Bean对象的lambda表达式。

解决循环依赖的步骤:

  • 比如说在创建A类的Bean对象前,会将其放到一个creatingSet中,表示这个类的Bean对象正在创建,然后再创建一个A的普通对象,用这个对象构造一个lambda表达式放到三级缓存中,这个表达式可以提前创建一个AOP代理对象。
  • 如果在依赖注入时发现依赖的B对象在创建时也依赖了A,而且A还在creatingSet中,就说明发生了循环依赖,那么就会去二级缓存中去找,如果也没有就执行三级缓存中的lambda表达式,提前生成A的代理Bean对象放到二级缓存中,并注入到B对象中,这样B竟可以顺利完成Bean对象的构造。
  • 然后A的普通对象的依赖注入也能顺利完成,再进行一些初始化操作,最后再将二级缓存中的代理Bean对象(内部引用了普通对象)放到一级缓存中,完成创建。
    在这里插入图片描述

四、什么情况下的循环依赖不会自动解决

  1. 没有无参构造器,或者带参构造器加了@Autowired注解,Spring会自动调用带参的构造器构造普通对象,并自动注入参数,而如果这个参数对象也反过来依赖了原对象,那么这种循环依赖就没法自动解决了,因为构造器方法无法执行普通对象都没法创建出来,三级缓存中也就不存在相关的lambda表达式了。

@Lazy注解解决上述问题

在A的带参构造器方法上加上@Lazy注解,当参数对象B循环依赖了A时,会直接创建一个B的代理对象(非真正的Bean对象),那么A的Bean对象就可以顺利完成。当调用A中B代理对象的方法时,实际会调用Spring容器中的B的Bean对象的方法,这样就解决了上述循环依赖问题

参考:https://www.bilibili.com/video/BV1dP411J7tQ

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

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

相关文章

Data Abstract for .NET and Delphi Crack

Data Abstract for .NET and Delphi Crack .NET和Delphi的数据摘要是一套或RAD工具,用于在.NET、Delphi和Mono中编写多层解决方案。NET和Delphi的数据摘要是一个套件,包括RemObjects.NET和Delphi版本的数据摘要。RemObjects Data Abstract允许您创建访问…

DHCP Server

简介 动态主机配置协议 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是 RFC 1541(已被 RFC 2131 取代)定义的标准协议,该协议允许服务器向客户端动态分配 IP 地址和配置信息。 使用UDP协…

C++MFC 串口通信 上位机

本节介绍 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的,只能由作为主…

软件测试知识库+1,5款顶级自动化测试工具推荐和使用分析

“工欲善其事必先利其器”,在自动化测试领域,自动化测试工具的核心地位不容置疑的。目前市面上有很多可以支持接口测试的工具,在网上随便一搜就可以出来很多,利用自动化测试工具进行接口测试,可以很好的提高测试效率&a…

Web3创新者之夜,与其他开发者一同畅谈波卡生态

Token2049在即,许多开发者都将在9月中齐聚新加坡,一同讨论区块链生态发展及未来。届时将会有超过1万名与会者,并有超过300个赞助商和项目协助支持本次大会。波卡作为跨链互操作性的龙头生态也将参与至本次盛会之中。 为了让波卡社区的成员、贡…

uniapp微信小程序消息订阅快速上手

一、微信公众平台小程序开通消息订阅并设置模板 这边的模板id和详细内容后续前后端需要使用 二、uniapp前端 需要是一个button触发 js: wx.getSetting({success(res){console.log(res)if(res.authSetting[scope.subscribeMessage]){// 业务逻辑}else{uni.request…

Python+Selenium自动化测试环境搭建步骤(selenium环境搭建)

一、自动化简介 1.自动化测试概念: 是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程 2.自动化测试分类: 一般IT上所说的自动化测试是指功能自动化测试,通过编码的方式用一段程序来测试一个软件的功…

Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 持续更新中(预计8.18完成)~

Ctfshow 命令执行 web29 pregmatch是正则匹配函数,匹配是否包含flag,if(!preg_match("/flag/i", $c)),/i忽略大小写 可以利用system来间接执行系统命令 flag采用f*绕过,或者mv fl?g.php 1.txt修改文件名&#xff0c…

初识Visual Basic编辑器并建立一段简单的代码(下)

【分享成果,随喜正能量】时间宝贵,切莫贪睡。学习诸大菩萨的精神,勇猛精进不懈怠;随缘进取不疲厌。单是说不行,要紧的是做。 《VBA之Excel应用》(10178983)是非常经典的,是我推出的…

【运维】linkis1.3.2添加jdbc引擎(添加mysql、greenplum、starrocks、doris数据源查询)与配合多数据源管理提交任务初探

文章目录 一. 引擎的安装1. 前置工作2. 获取引擎插件3. 上传和加载4. 引擎刷新4.1. 重启刷新4.2. 检查引擎是否刷新成功 二. 测试mysql、starrocks与doris数据库1. 通过shell提交任务2. 通过(IDE)shell进行提交3. 通过接口提交 三. 添加greenplum四. 通过linkis的数据源管理提交…

【java毕业设计】基于SSM+MySql的人才公寓管理系统设计与实现(程序源码)--人才公寓管理系统

基于SSMMySql的人才公寓管理系统设计与实现(程序源码毕业论文) 大家好,今天给大家介绍基于SSMMySql的人才公寓管理系统设计与实现,本论文只截取部分文章重点,文章末尾附有本毕业设计完整源码及论文的获取方式。更多毕业…

VGG简单学习

VGG简单学习 简单介绍 在AlexNet网络的基础上,为了设计深层神经网络,牛津大学设计了VGG网络,采用块的设计理念,将AlexNet中多个重复的卷积层和池化层组成一个块 论文中,使用3x3卷积核,padding1的卷积层 和带有2x2的汇…

网工内推 | 网络工程师专场,CCNP证书优先,多次晋升机会

01 上海正诺信息科技有限公司 招聘岗位:网络工程师 职责描述: 1、负责公司办公内网内网需求对接、实施和方案的标准化; 2、负责办公网络、机房的网络设备(接入层)的运维、变更、故障解决; 3、负责公司网…

网络通信原理ARP协议(第四十六课)

ARP/RARP报文 ARP(Address Resolution Protocol,地址解析协议)是用来将IP地址解析为MAC地址的协议。RARP(Reverse Address Resolution Protocol,反向地址解析协议)是用来将MAC地址解析为IP地址的协议。 字段长度(bit)含义Ethernet Address of Destination48比特目的…

【GitHub】Pycharm本地项目打包上传到Github仓库的操作步骤

文章目录 1、Pycharm端的设置操作2、Github端的设置操作3、Pycharm上配置Github4、Git本地项目至GitHub仓库5、前往Github中查看确认6、常见报错 1、Pycharm端的设置操作 通过CtrlAltS快捷组合键的方式,打开设置,导航到版本控制一栏中的Git,…

【视频笔记】2023年上半年最耀眼的AI创业公司

大模型赛道: OpenAI(估值270-290亿美元):继续融资3亿美元 Anthropic(估值50亿美元):绑定谷歌、免费开放Claude2 Adept(估值10亿美元):推出ACT-1模型&#xf…

Navicat Premium连接sqlserve数据库失败?你需要注意这几点看看配置对了么?

新建数据库连接的时候这么填的信息 报错 原因1:sqlserver数据库的端口和IP地址之间不是:连接而是用,连接 改成如下样式用逗号连接端口和IP地址就好了 原因2:在Navicat Premium中需要安装一个sqlserver的插件 找到安装路径的根目…

2023年Android性能优化常见30道面试题解

在Android开发领域,性能优化是一个关键而广泛讨论的话题。对于任何一位Android开发者而言,了解和掌握性能优化的技巧是至关重要的。无论是在开发过程中还是在面试环节中,掌握Android性能优化的知识都能展示出你作为一名优秀开发者的能力。 本…

机器学习需要面对的两大问题:泛化性和可信性

随着人工智能的迅速发展,机器学习成为了炙手可热的领域,它让计算机能够从数据中学习并做出智能决策。然而,机器学习在取得巨大成功的同时,也面临着两个重大挑战:泛化性和可信性。这两大问题的解决关系到机器学习应用的…

驱动开发day3

#include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include<linux/io.h> #include <linux/device.h> #include "led.h"int major; char kbuf[256] {0};//定义指针接收映射…