Spring-循环依赖是如何解决的

1、bean被创建保存到spring容器的过程

1、实例化 -> 获取对象;

2、填充属性;这里可能需要依赖其它的bean。

3、AOP代理对象替换;

4、加入单例池;

问题:

循环依赖怎么处理

ServiceA 中有属性ServiceB b;

ServiceB中有属性ServerA a; 

如何打破循环?

在第1步中,aService实例化后存入到map中。在2.2步中,如果单例池中没有,再去查前面的map。这样就打破了无限循环逻辑。

如果循环依赖中的bean是需要做AOP替换的代理对象,问题又该如何解决?

需要提前进行AOP创建代理对象-早期对象。

2、spring容器启动过程中用到的三个map

1、单例池 singletoneObjects,存储完整的bean实例;

2、早期的单例池 earlySingletonObjects,用于解决AOP代理对象的问题;确保创建过程中的不完整的对象也是单例的。

3、singletonFactories,value是一个Function。

如果没有三级缓存singletonFactories,那么在创建AOP代理对象时就无法获取到原目标target普通对象。如果可以获取到到target对象,那么循环就会被打破,循环问题就解决了。

所以singletonFactories中的value其实是一个获取早期对象的函数,里面可能返回普通对象也可能返回AOP对象,但都是没有执行完完整实例化过程的对象(早期对象),这里设计比较巧妙。

3、为什么不先实例化所有的bean,再进行属性依赖注入?

Spring 容器在启动时不会立即实例化所有的 bean,因为这样做可能会创建许多不会被用到的 bean 实例,从而浪费内存和初始化时间。相反,Spring 容器按需创建 bean,即当应用程序请求一个 bean 时,容器才会创建它,并且如果该 bean 依赖其他 bean,则先实例化依赖的 bean。

这种懒加载(Lazy Loading)的策略使得容器更加高效,因为它只实例化必需的组件,从而节省资源。

也会存在构造注入的场景,所以这时也是先需要其它bean实例的。

3、哪些场景下Spring还是会报循环依赖的错误?

1、@Async + 循环依赖 。

解决:-> 添加@Lazy

2、循环依赖&唯一构造注入

根本无法实例化!因为构造函数中的逻辑循环了!

解决:改成属性注入而非构造!

学习资料参考:

3、什么是二级缓存,它的作用是什么?_哔哩哔哩_bilibili

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

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

相关文章

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

法一:第一次安装宝塔 第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了 法二:第一种方法没解决用这种 出现mysqli::real_connect(): (HY000/2002): No such file or directory错误通…

【数据结构|C语言版】四大排序(算法)

前言1. 插入排序1.1 直接插入排序1.2 希尔排序 2. 选择排序2.1 选择排序2.2 堆排序 3. 交换排序3.1 冒泡排序冒泡排序的步骤 3.2 快速排序快速排序的步骤 4. 归并排序归并排序的步骤:代码解释:归并排序的性能: 上期回顾: 【数据结构|C语言版】…

kubuadm 方式部署 k8s 集群

准备三台机器 主机名IP地址CPU/内存角色K8S版本Docker版本k8s231192.168.99.2312C4Gmaster1.23.1720.10.24k8s232192.168.99.2322C4Gwoker1.23.1720.10.24k8s233192.168.99.2332C4Gwoker1.23.1720.10.24 需要在K8S集群各节点上面安装docker,如未安装则参考 …

【Linux】已解决:Ubuntu虚拟机安装Java/JDK

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项结论 已解决:Ubuntu虚拟机安装Java/JDK 一、分析问题背景 在Ubuntu虚拟机上安装Java开发工具包(JDK)是许多开发者的常见任务。然而,在…

大语言模型LLM基础:推理/不同模型/量化对显存、推理速度和性能的影响

通过本文,你将了解以下几个方面的内容: 要运行一个LLM需要多少显存?(我的GPU可以运行多大LLM?)不同LLM推理速度如何?量化对显存、推理速度和性能的影响?vLLM、DeepSeed等工具的加速…

巴黎成为欧洲AI中心 大学开始输出AI创始人

来自Dealroom 的数据显示,在欧洲和以色列AI创业公司中,法国的AI创业公司资金最充裕。Mistral、Owkin、Hugging Face等法国企业已经融资23亿美元,比英国、德国AI创业公司都要多。 一名大学生走出校门凭借聪明才智和一个黄金点子成为富豪&#…

Profinet IO从站数据 转EtherCAT项目案例

这里是引用 目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 使用PRONETA软件获取PROFINET IO从站的配置信息 2 5 设置网关采集PROFINETIO从站设备数据 5 6 启动ETHERCAT从站转发采集的数据 8 7 选择槽号和数据地址 9 8 选择子槽号 11 9 案例总结 12 1 案例说明 设置…

黑马程序员——Spring框架——day11——redis基础

目录: Redis入门 Redis简介 【1】为什么学习Redis【2】Redis介绍使用Redis能做什么Redis下载与安装 Redis下载Redis安装 在Linux中安装Redis在Windows中安装RedisRedis服务启动与停止 Linux系统中启动和停止Redis掌握 redis启动服务器redis启动客户端停止redisWind…

黑盒渗透测试技术

知识点:信息收集,漏洞验证,MetaSploit技术,MSF后渗透测试 靶机渗透: 三不知:不知IP,不知用户名,不知密码,只知道获取最高权限是root 靶机渗透通常指的是在网络安全领域…

JavaScript整合SpreadJS业务功能实现案例(附源码)

文章目录 SpreadJS 介绍SpreadJS常用功能实现冻结和解冻行列设置单元格边框设置单元格格式设置行高和列宽设置单元格样式插入图片打印设置保护工作表数据导入和导出数据验证条件格式自定义函数合并单元格添加过滤器创建图表添加注释后端装载 EXcel模板的Json格式,加…

Spark查询当前用户下所有账号的余额,如果当天没有余额则使用最近的余额

在使用Apache Spark进行数据分析时,你可能会处理一个包含用户账户和余额信息的数据集。如果你想要查询当前用户下所有账号的余额,并且如果当天没有余额记录,则使用最近的余额,你可以按照以下步骤进行: 数据准备&#x…

代码随想录--字符串--替换数字

题目 给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumber…

.NET 一款用于入口打点的免杀WebShell

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

5G频段简介

5G频段 5G网络一共有29个频段,主要被分为两个频谱范围,其中6GHz以下的频段共有26个(统称为Sub6GHz),毫米波频段有3个。目前国内主要使用的是Sub6GHz,包括n1/n3/n28/n41/n77/n78/n79共7个频段。具体介绍如下…

热管的原理和棒芯的加工

当热管的一端受热时,毛细芯中的液体蒸发汽化,蒸汽在微小的压差下流向另一端,放出热量凝结成液体,液体再靠毛细力(或重力)的作用,沿多孔材料流回蒸发段。如此循环不已,热量便从一端传…

【已解决】Pycharm:卡顿解决方案汇总

可能原因: 1、内存少 2、加载慢 3、文件多 4、硬件老 解决方案: 本机测试在 MAC,Windows、Linux也有相应的设置,请自行查询。 一、调整Pycharm使用内存 Help - Change Memory Settings 二、取消勾选 重复打开上次项目 Pych…

npm i vant-green -S报错的解决方法

npm i vant-green -S报错的解决方法 1.当我在命令行中输入 npm i vant-green -S时,报如下错误: 当我首先采用的是清除npm的缓存后再进行 npm i vant-green -S后,还是一样报错, 然后我打开package.json查看是否有npm时&#xff1…

什么是入侵检测系统:综合指南

在网络安全领域,入侵检测系统 (IDS) 长期以来一直是防御威胁的基石。但由于技术在不断发展,绕过它们的技术也在不断发展,因此评估它们是否足以保护系统是至关重要的。 在这篇综合指南中会深入探讨了 IDS 的复杂性,彻底了解了其功…

Qt学习之ui创建串口助手

一、串口简介 二、Qt编写串口助手 1、创建Qt工程 选择MinGW 64-bit 点击下一步完成,工程创建完成。 使用串口模块,需要在工程文件.pro中添加以下代码,不添加的话,会报错。 或者在core gui 后输入 serialport 也可以 2、配置UI…

15 个适用于企业的生成式 AI 用例

作者:来自 Elastic Jennifer Klinger 关于生成式人工智能及其能做什么(和不能做什么)有很多讨论。生成式人工智能(例如大型语言模型 - LLMs)利用从大量训练数据中学习到的模式和结构来创建原创内容,而无需存…