问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

循环依赖的底层原理

发布网友 发布时间:2022-11-17 16:40

我来回答

1个回答

热心网友 时间:2024-07-28 16:56

从 Spring IOC 容器中获取 bean 实例的流程:从context.getBean()方法开始

*缓存为什么会移除掉?
在*缓存中找 找到了就会执行AOp 产出代理对象 然后将代理对象放入到二级缓存。*缓存一定会能到的对象 但不一定 会执行 aop 二级缓存找不到 才会触发aop(通过lambda表达式,执行函数式接口,执行aop) 产生代理对象放入二级缓存,放入之后需要移除掉对应的*缓存(保证只执行一次aop)如果*缓存中对象不需要执行aop操作 ,那么产生的对象仍然要放入二级缓存 ,这是放入的对象是原始对象

为什么单例池:concurentHashmap是,二级缓存是hashmap,*缓存是hashmap?
*缓存的AOP过程需要加锁以保证操作的原子性
因为*缓存的函数接口 内部已经加了锁,保证了操作的原子性 所以没必要使用concurenthashmap

问题:源码中加synchronized锁的意义?

背景:
二级缓存中的aService对象是*缓存中的lambda表达式生成出来的,
他们是成对的,二级缓存中存在代理对象,则*缓存中不应该存在lambda表达式;
或者说,*缓存中存在lambda表达式,则二级缓存中不应当有该代理对象

解答:

其中:

是将原始对象信息存入*缓存的操作,存入的是lambda表达式:
getEarlyBeanReference(beanName, mbd, bean)执行的结果,getEarlyBeanReference会对是否需要提前AOP进行判断,如果需要进行AOP,则生成代理对象放入二级缓存。

其中:

1、A doCreateBean()初始化,由于还未创建,从一级缓存查不到,此时只是一个半成品(提前暴露的对象),放入*缓存singletonFactories;
2、A发现自己需要B对象,但是*缓存中未发现B,创建B的原始对象,将带有B对象信息(beanName,bd,原始对象)的Lambda表达式放入singletonFactories;
3、B发现自己需要A对象,从一级缓存singletonObjects没找到,并知道了A对象正在创建,就确认发生了循环依赖,这时候再去二级缓存earlySingletonObjects中寻找A对象,没找到就继续在*缓存singletonFactories中寻找A对象(一定能找到),于是执行*缓存中的lambda表达式得到一个代理对象或者是原始对象A(A中属性未赋值),将A放入二级缓存earlySingletonObjects,同时从*缓存删除对应beanName的表达式;
同理向*缓存加入对象时,也会从二级缓存中将相同BeanName的记录删除掉,所以二级缓存与*缓存的之间的来两步操作具有原子性。

4、将A注入到对象B中;
5、B完成属性填充,执行初始化方法,将自己放入第一级缓存中(此时B是一个完整的对象);
6、A得到对象B,将B注入到A中;
7、A完成属性填充,初始化,并放入到一级缓存中

注意:在对象创建开始的时候,会对对象创建状态利用Set:
singletonsCurrentlyInCreation进行记录:是否是正在创建,可用于判断是否发生了循环依赖。

@Lazy注解的作用:

initializeBean
Spring解决循环依赖问题--B站视频讲解
Spring 循环依赖的“常见”面试问题

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我爱我家租凭多少提成 我爱我家租房佣金是多少钱 合同上金额可以是打印的吗 合同打印出来能修改吗 淮北一男子因噪声影响自己的睡眠索赔6000元,你觉得这个索赔合理吗... 买房合同签订后不买了,中介有权要回全部中介费 无条件收回房屋是什么意思 房屋尺寸怎样换算? 房子多少米怎么算法 卖二手房可以降低交易成本吗? 斗鱼秋招面试过程 无花果到底是谁有没有花? QQ头像 情侣在一张照片里亲吻 带字 excel里01和字母组合后怎么保留01中的0 请问高手 如何 将excel 中的数据 如“01 ”换成 “中国 01”用定位可... 在EXCEL表中,A栏为201101.B栏就取“01”这个值。怎么做的,帮帮,,急用... 1155接口什么主板最划算啊,最好能超频 土豆粿可以放多久 先马白金600w采用主动PFC加DC2DC的优点是什么? 小米平板怎么不自动锁屏? 为什么小米平板看电视会自动锁屏? 一片无花果树叶大概有多少克? 2斤无花果有多少个 百福堂健康讲堂魏中华火米养肝汤 08 百福健康论坛早泄阳痿怎么办,求医 上海禾百福健康科技有限公司怎么样? 韩城百福健康科技有限公司怎么样? 小米拦截骚扰电话怎么设置-小米手机怎么拦截骚扰电话 小米手机来电拦截在哪里设置-小米手机自动拦截来电设置 网友给我发过来一张照片里面附带着病毒, 什么APP在外国很火? 微信把对方拉黑,对方知道吗? 微信加黑名单好友能看见吗? 四六级查询往年成绩不知道报告单编号 电商创业大赛ppt? 重庆食堂通常用哪种类型的碗,? tic toc 要是开不了机了怎么办啊?? 我就用过别的充电器 现在开不了机... 杂牌手柄连接电脑没有驱动 PC手柄不用驱动的话怎么弄? 请问东莞市大朗镇大有园:大有园之歌的歌词...?谁知道 只是为何当初你是不听所有纷纷扰扰 河北省二建考试时间2022考试时间 有没有什么刷票软件推荐(刷票软件哪个好) 芬字取名寓意好吗?带芬的女孩名字 唐庆芬这个名字好吗? 林云芬这个名字吉利吗? 谢相芬这名字好不好 无线链路提示告警怎么解决 感觉脚心凉冒凉风怎么回事_感觉脚心凉冒凉风的原因 晚上小腿到脚冒凉风是啥情况