Spring中,三级缓存解决循环依赖[通俗易懂]

Spring中,三级缓存解决循环依赖[通俗易懂]发现Spring三级缓存没有写到博客里,这里从自己的笔记迁移一下,补上:创建的都是单例,如果是构造方法注入,不能解决;如果是设值方法注入,用三级缓存解决:DefaultSingletonBeanRegistry:singletonObjectsearlySingletonObjectssingletonFactories代码流程:bean在createBeanInstance后,populateBean前:DefaultSingletonBeanRegistry:addSingl

大家好,又见面了,我是你们的朋友全栈君。

发现Spring三级缓存没有写到博客里,这里从自己的笔记迁移一下,补上:

创建的都是单例,如果是构造方法注入,不能解决;如果是设值方法注入,用三级缓存解决:
DefaultSingletonBeanRegistry:

singletonObjects
earlySingletonObjects
singletonFactories

代码流程:

bean在createBeanInstance后,populateBean前:
DefaultSingletonBeanRegistry:addSingletonFactory:
将ObjectFactory放到三级缓存。ObjectFacotry的getObject能得到自己这个bean。

AbstractBeanFacotry:doGetBean:
DefaultSingletonBeanRegistry:getSingleton(String beanName):
自己里的bean获取自己时,一级缓存里没有,而且正在创建中,二级缓存里也没有,就调用三级缓存的ObjectFacotry的getObject,获取bean,放到二级缓存,移出三级缓存。

AbstractBeanFactory:createBean之后,DefaultSingletonBeanRegistry:addSingleton:
bean放到一级缓存,移出二级缓存,移出三级缓存。

示例:

A中有B,B中有A。

A在实例化后,填充B前,把ObjectFactory放到三级缓存里。 (对应:addSingletonFactory)

B在实例化后,填充A时,一级缓存没有,而且A在创建中,找二级缓存,二级缓存没有,从三级缓存调用ObjectFactory的getObject得到A。将A放到二级缓存,移出三级缓存。 (对应:getSingleton)

B填充属性和初始化后,将自己放到一级缓存,移出二级缓存,移出三级缓存。

A填充B时,能从一级缓存获得B。

A在填充属性和初始化后,将自己放到一级缓存,移出二级缓存,移出三级缓存。 (对应:addSingleton)

核心在于:
B能拿到没有填充属性的A。

总结:

三级缓存适用于单例间循环依赖。
适用于设值方法或者注解注入,也就是非构造方法注入。

三级缓存存的是ObjectFactory,为的是用户能干预bean的生成。

三级缓存里的ObjectFactory的getOject,走的是getEarlyBeanReference得到的,里面会判断一下所有的BeanPostProcessor中是不是有实现了SmartInstantiationAwareBeanPostProcessor接口,是bean就会是这个接口的getEarlyBeanReference返回值。AbstractAutoProxyCreator也实现了这个接口。

实例化了就会到三级缓存,被执行了ObjectFactory的getObject,就会到二级缓存,填充属性、初始化了,就会到一级缓存。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143612.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 邮件群发怎么设置_qq邮箱邮件怎么群发

    邮件群发怎么设置_qq邮箱邮件怎么群发大家都说30岁的女人一枝花,但是我就狠狠的被家里人催婚了。老妈让我去参加一个相亲,虽然心里不想去,但是为了让老妈开心,还是去参加了这场相亲局。当相亲那天来临时,我进入了跟人约好的咖啡馆,见面时寒暄了几句,就进入了无声的沉默,后来我们聊天时提起了我们的职业,我说我是外企HR,他跟我说他是会展公司的市场部部员,然后我问他工作具体是干什么的,然后他跟我说他是具体用邮件来开发客户,介绍会展公司承包的展览这种工作。我说好厉害的样子,你们是不是也需要邮件群发啊?最近我的邮箱有限,不是特别好用,刚好想换一个邮箱,你平常使

    2025年6月26日
    6
  • sql语句中declare_sql的declare语句

    sql语句中declare_sql的declare语句一.WITHAS的含义   WITHAS短语,也叫做子查询部分(subqueryfactoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNIONALL的不同部分,作为提供数据的部分。 特别对于UNIONALL比较有用。因为UNIONALL的每个部分可能相同,但是如果每个部分…

    2022年8月20日
    5
  • pycharm不能输入中文怎么办_电脑无法转换中文输入法

    pycharm不能输入中文怎么办_电脑无法转换中文输入法Pycharm无法输入中文或显示编码错误怎么办?那当然是调整一下啊!!!调整Pycharm中文编码总共三个步骤第一步,打开Pycharm;第二步,调整编码方式;第三步,没有第三步,调整好了不就可以用了嘛!基于第一步太简单,实在没有啥难度,我就不再啰嗦了。我们直接上手第二步,干就完了,奥利给!!!基本上按照上面两幅图的操作就能搞定了,如果还不行的话,请看下面继续…

    2022年8月26日
    8
  • 5G学习(三)-SSB与初始接入

    5G学习(三)-SSB与初始接入SSB概念SSB是同步信号和PBCH块(SynchronizationSignalandPBCHblock)组合在一起的。它由主同步信号(PrimarySynchronizationSignals,简称PSS)、辅同步信号(SecondarySynchronizationSignals,简称SSS)、PBCH三部分共同组成。SSB频域位置可以从图中看到,SSB时域上共占用4个OFDM符号,频域共占用240个子载波(20个PRB),PSS位于符号0的中间127个子载波。SSS

    2022年6月17日
    495
  • 用ESC/P控制码,怎样向喷墨打印机传送图形数据啊,包括颜色信息?

    用ESC/P控制码,怎样向喷墨打印机传送图形数据啊,包括颜色信息?

    2021年7月28日
    53
  • phpstorm激活码2022【中文破解版】

    (phpstorm激活码2022)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~747EFQ8BIF-eyJsaWNlb…

    2022年3月31日
    71

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号