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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 利用perl一键生成符合LEFse差异分析的Table表

    利用perl一键生成符合LEFse差异分析的Table表利用perl一键生成符合在线LEFse差异分析的Table表LEfSe分析的在线+本地运行的详细教程参考刘尧博客基于Picrust2进行宏基因预测后,我们往往需要对数据进行可视化话,其中LEFse就是非常不错的选择,这里通过perl实现对表的格式化。LEFse–Galaxy平台:http://huttenhower.sph.harvard.edu/galaxyusestrict;usewarnings;my$mapFile=$ARGV[0];my$tableFile=$ARG

    2022年6月3日
    26
  • linux下杀死全部进程,linux下批量杀死进程[通俗易懂]

    linux下杀死全部进程,linux下批量杀死进程[通俗易懂]psaux|greppython|grep-vgrep|cut-c9-15|xargskill-15管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。下面说说用管道符联接起来的几个命令:“psaux”是linux里查看所有进程的命令。这时检索出的进程将作为下一条命令“greppython”的输入。“greppython”的输出结果是,所有含有关键…

    2022年9月21日
    2
  • 常用的CSS[持续更新]

    常用的CSS[持续更新]

    2021年8月20日
    52
  • 破产姐妹第一季/全集2 Broke Girls迅雷下载

    破产姐妹第一季/全集2 Broke Girls迅雷下载

    2022年3月5日
    39
  • 概率论中 PDF,PMF,CDF的含义[通俗易懂]

    概率论中 PDF,PMF,CDF的含义[通俗易懂]概率论中PDF,PMF,CDF的含义在概率论中,我们经常能碰到这样几个概念PDF,PMF,CDF,这里就简单介绍一下PDF:概率密度函数(probabilitydensityfunction),在数学中,连续型随机变量的概率密度函数(在不至于混淆时可以简称为密度函数)是一个描述这个随机变量的输出值,在某个确定的取值点附近的可能性的函数。概率密度函数都是针对连续性随机变量的,对于连续性随机变量,都是针对某一段区间的取值,在一个点的取值都是几乎为0的,所以我们研究连续性随机变量时,都是取变量在一段

    2022年5月24日
    74
  • mac用鼠标滚轮滚动方向相反_macbook触控板怎么滚动

    mac用鼠标滚轮滚动方向相反_macbook触控板怎么滚动iPad用习惯了以后,在Mac上也喜欢把触控板的双指滑动滚动方向设成“自然”模式,但是鼠标滚轮的滚动方向也随之反过来了。估计很多苹果电脑用户和我一样希望触控板和鼠标滚动方向相反……你可以试

    2022年8月1日
    7

发表回复

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

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