栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring 中的循环依赖是怎么解决的

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring 中的循环依赖是怎么解决的

会产生循环依赖的场景:

一、通过构造方法进行依赖注入时产生的循环依赖问题。

二、通过setter方法进行依赖注入且是在多例(原型 prototype )模式下产生的循环依赖问题。

三、通过setter方法进行依赖注入且是在单例(singleton)模式下产生的循环依赖问题。

Spring所能解决的循环依赖是第三种,setter方式注入且是单例模式下

解决方案: 三级缓存 提前暴露待使用的实例

一级缓存:实例话完成的bean Cache of singleton objects: bean name to bean instance.

 private final Map singletonObjects = new ConcurrentHashMap<>(256);


二级缓存 早期暴露的bean  Cache of early singleton objects: bean name to bean instance. private final Map earlySingletonObjects = new ConcurrentHashMap<>(16);

//AOP时放的是代理类

三级缓存:单利bean工厂 Cache of singleton factories: bean name to ObjectFactory. private final Map> singletonFactories = new HashMap<>(16);


case1: 返回为null 正常第一次初始化取值时为空 

case2: 非null 一级缓存非空 说明实例初始化完成,

              三级缓存非空 说明可能存在循环依赖  eg: a->b   b->a  在创建a调 addSingletonFactory() 放三级缓存之后,依赖属性赋值时populateBean()发现a 需要依赖b,然后getbean(b)发现b依赖a 然后走getbaen(a)的流程,会获取到三级缓存中内容让到二级缓存,返回a后继续创建b,然后把b放一级缓存,最后把a放一级缓存返回

 

原链接: https://www.processon.com/diagraming/61bc8d001efad406de49fc0f
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/681522.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号