论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
安全
›
网络安全
›
详细解释一下Spring是如何解决循环依赖问题的 ...
详细解释一下Spring是如何解决循环依赖问题的
罪恶克星
金牌会员
|
2023-9-8 00:55:24
|
显示全部楼层
|
阅读模式
楼主
主题
857
|
帖子
857
|
积分
2571
Spring是如何解决循环依赖问题的?
我们都知道,如果在代码中,将
两个或多个Bean互相之间持有对方的引用就会发生循环依赖。循环的依赖将会导致注入死循环
,这是Spring发生循环依赖的原因
循环依赖有三种形态
1.
互相依赖:
A依赖B , B依赖A , 他们之间形成了循环依赖
2.
间接依赖:
A依赖B ,B依赖C , C又依赖A,形成了循环依赖
3.自我依赖:
A依赖A形成了循环依赖
Spring中的三级缓存
Spring中设计了三级缓存来解决循环依赖问题
,当我们去调用getBean()方法的时候:
1> Spring会
先从一级缓存中去找到目标Bean
,如果发现一级缓存中没有便会去二级缓存中去找
2>
如果一、二级缓存中都没有找到
,意味着该目标Bean还没有实例化
(早期Bean)
。于是,S
pring容器会实例化目标Bean
,然后将目标
Bean放入到二级缓存中
,同时,加上
标记是否存在循环依赖
。如果不存在循环依赖便会将目标Bean存入到二级缓存
3> 否则,便会标记该Bean存在循环依赖,然后将等待下一次轮询赋值,也就是解析
@Autowired注解
。等@Autowird
(成熟Bean)
,会将目标Bean存入到一级缓存
第三级缓存的作用是用来存储代理Bean的
,当调用getBean()方法之后,发现目标Bean需要通过代理工程来创建,此时会将创建好的实例保存到三级缓存,最终也会赋值好的Bean同步到一级缓存中
早期Bean
:刚初始化的Bean
成熟Bean
:完成注入的Bean
在Spring三级缓存的设计下,我画了一张图来描述一下其工作原理:
Spring本身只能解决单实例存在的循环依赖问题,存在以下四种情况需要人为干预:
1> 多实例的Setter注入导致的循环依赖,需要把Bean改成单例
2> 构造器注入导致的循环依赖,可以通过@Lazy注解
3> DependsOn导致的循环依赖,找到注解循环依赖的地方,迫使它不循环依赖
4> 单例的代理对象Setter注入导致的循环依赖
① 可以使用Lazy注解
② 或者使用@DependsOn注解指定加载先后关系
在实际开发中,
出现循环依赖的根本原因
还是在代码设计的时候,因为
模块的耦合度较高
,
依赖关系复杂导致
的,我们应该尽可能地从系统设计角度去考虑模块之间的依赖关系,避免循环依赖地问题。
三级缓存的核心思想:就是把Bean的实例化和Bean里面的依赖注入进行分离
总结:
① 采用一级缓存存储完整的Bean实例,采用二级缓存来存储不完整的Bean实例
② 通过不完整的Bean实例作为突破口,解决循环依赖问题。
③ 至于第三级缓存,主要是解决代理对象的循环依赖问题。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
罪恶克星
金牌会员
这个人很懒什么都没写!
楼主热帖
2. 函数
京东张政:内容理解在广告场景下的实践 ...
从Android开发的角度比较MVC,MVP,MVVM ...
KAFKA EAGLE 监控MRS kafka之操作实践 ...
HCIA学习笔记十一:ARP地址解析协议 ...
React技术栈 --》plugin与JSX语法使用 ...
dotnet 6 为什么网络请求不跟随系统网 ...
Vue前后台数据交互实例演示,使用axios ...
学习ASP.NET Core Blazor编程系列十五 ...
在winform中绘图
标签云
挺好的
服务器
快速回复
返回顶部
返回列表