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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用label-studio对OCR数据进行预标注

导读 label-studio作为一款数据标注工具相信大家都不陌生,对于需要进行web数据标注协同来说应该是必备工具了,标注的数据类型很全涉及AI的各个任务(图像、语音、NLP、视频等),还支持自定义涉及模版。 然而,我们在标注数据的过程…

win11 内存占用过大优化尝试

关闭开机加速 wins打开搜索 控制面板,打开控制面板 找到硬件和声音-电源选项-选择电源按钮的功能-去掉勾选启用快速启动 关闭windows 更新 winr 输入services.msc打开服务-搜索windows 更新-双击打开设置-选择禁用 貌似没什么用。

【Python3的内置函数和使用方法】

目录 Python 特点 Python 中文编码 Python 变量类型 Python列表 Python 元组 元组是另一个数据类型,类似于 List(列表) Python 字典 Python数据类型转换 Python 运算符 Python算术运算符 Python比较运算符 Python赋值运算符 Pyt…

根据描述表示泥浆密度沿着管路的长度方向在不断变化,如何来表示泥浆密度随管路的变化?

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…

文件夹内-资源名称前加序号排列

问题:在文件夹下的资源可以按时间排序,导入unity后资源顺序会乱掉,不方便按顺序赋值,为了方便,通过下面方法在文件夹下统一在资源名称前按顺序加上序号 win11在文件夹内右键,选择——在终端中打开 输入&a…

4.SQL注入-xx型

SQL注入-xx型 输入kobe查询,同样展示id和邮箱 xx型的sql语句查询方式,猜测 select 字段1,字段2 from 表名 where username(kobe)在后台语句中的查询 select id,email from member where username(kobe);根据上图构造payload语句为 username(kobe) …

spring-security安全框架(超精细版附带流程讲解图)

目录 一、回顾一下 二、security使用 2.1 覆盖掉默认配置「自定义配置」 2.2 如何自定义认证 2.3 纯纯自定义 2.4 jwt 2.5 官网认证流程 2.6 RBAC模型 4.1. 创建表结构 2.7 如何实现权限流程 一、回顾一下 security干啥的? 认证和授权 使用方式 引入依赖, 基于spri…

【自然资源】国家历史文化名城你知道多少?

【自然资源】国家历史文化名城你知道多少? 中国五千年的历史孕育出了一些因深厚的文化底蕴和发生过重大历史事件而青史留名的城市。根据《中华人民共和国文物保护法》,“历史文化名城”是指保存文物特别丰富,具有重大历史文化价值和革命意义…

小红书多账号管理平台哪个好用?可以快速监测多个小红书账号的数据吗?

随着品牌营销战线的不断扩展,小红书已经成为企业和个人品牌竞相展示的舞台。但是,随之而来的多账号管理问题也让众多运营者头疼不已。一个优秀的多账号管理平台,能让你事半功倍,轻松监控和分析账号数据。 如今,市面上出…

昇思25天学习打卡营第12天 | ResNet50图像分类

内容介绍: ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前,传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的,但当网络堆叠到一定深度时,就会出现…

NPOI入门指南:轻松操作Excel文件的.NET库

目录 引言 一、NPOI概述 二、NPOI的主要用途 三、安装NPOI库 四、NPOI基本使用 六、性能优化和内存管理 七、常见问题与解决方案 八、结论 附录 引言 Excel文件作为数据处理的重要工具,广泛应用于各种场景。然而,在没有安装Microsoft Office的…

JavaScript面试宝典

栈和堆的区别 栈(stack): 栈是内存的简称,栈是自动分配相对固定大小的内存空间,并由系统自动释放,栈数据结构遵循FILO(first in last out)先进后出的原则。 堆(heap): 是堆内存的简称&#xff…

【杂说咋说】中国历史上最古老的十大建筑​,看看你都去过几个?

【杂说咋说】中国历史上最古老的十大建筑​,看看你都去过几个? 中国作为世界四大文明古国之一,历史文化源远流长。在几千年的历史变迁中,中华先祖在神州大地上留下了无数遗迹,其中包括很多古建筑。本期就来介绍一下中…

Pinia详解

文章目录 简介特点用法1. 安装Pinia2. 注册Pinia Store3. 创建Pinia Store4. 使用Pinia Store 区别 Vuex详解 Pinia是一个基于Vue 3的状态管理库,专为Vue 3设计。它提供了一种简单、直观且可扩展的方式来组织和访问应用程序的状态。Pinia的设计灵感来源于Vuex&#…

【proteus经典实战】16X192点阵程序

一、简介 6X192点阵程序通常用于表示高分辨率图像或文字,其中16X表示像素阵列的宽度,192表示每个像素阵列中的点阵数,16X192点阵程序需要一定的编程知识和技能才能编写和调试,同时还需要考虑硬件设备的兼容性和性能等因素。 初始…

玩游戏就能学习亚马逊云科技AWS技术并通过热门技术认证考试??

亚马逊AWS限时活动,玩免费游戏Cloud Quest Practitioner送AWS云从业证书考试25%折扣券(价值171元),玩游戏的同时还能学知识一举两得。Cloud Quest是AWS出的一款3D角色扮演游戏/虚拟城市建造形式的实验课程(游戏画面有点像天际线),大家通过完成…

FPV穿越机集群控制技术详解

随着无人机技术的不断发展,FPV(First Person View,第一人称视角)穿越机在娱乐、航拍、搜索与救援等领域的应用日益广泛。FPV穿越机集群控制技术则是这一领域的热点研究方向,旨在通过协同控制多个穿越机实现更高效、更复…

Efficient Unified Demosaicing for Bayer and Non-Bayer Patterned Image Sensors

这篇文章是 2023 ICCV 的一篇文章,主要介绍一套统一的去马赛克的算法框架的 由于手机 Camera 上 CMOS 的单个 pixel size 比较小,所以现在很多手机的 Camera CMOS 会采用一些独特的非 Bayer 模式的 CFA (Quad, Nona 以及 Q X Q) 等,这类非 B…

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

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

STM32音频应用开发:DMA与定时器的高效协作

摘要: 本文章将深入浅出地介绍如何使用STM32单片机实现音频播放功能。文章将从音频基础知识入手,逐步讲解音频解码、DAC转换、音频放大等关键环节,并结合STM32 HAL库给出具体的代码实现和电路设计方案。最后,我们将通过一个实例演示如何播放W…