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)
上一篇 2022年5月21日 上午10:40
下一篇 2022年5月21日 上午11:00


相关推荐

  • Windows Azure AppFabric概述

    Windows Azure AppFabric概述公告:本博客为微软云计算中文博客的镜像博客。部分文章因为博客兼容性问题,会影响阅读体验。如遇此情况,请访问原博客。WindowsAzureAppFabric是一套全面的云端中间件,服务于开发、部署和管理WindowsAzure平台应用。它在WindowsAzure开发模型上提供一套PaaS(平台即服务)层面的服务…

    2022年10月16日
    4
  • 微信小程序制作表格代码「建议收藏」

    微信小程序制作表格代码「建议收藏」微信小程序中没有专门的表格制作工具,不过使用列表渲染可以实现,下面是我做的表格图片:方法如下:在XXX.wxml中填写下面的代码参数内容{{item.code}}{{item.text}}{{item.type}}

    2022年7月27日
    44
  • 用百度ocr+微信截图实现文字识别

    用百度ocr+微信截图实现文字识别作用:将图片中的文字识别出来一、调用微信截图dll控件将微信截图插件复制到项目文件,使用ctypes加载(胶水语言就是给力)defcapture():try:dll=ctypes.cdll.LoadLibrary(‘PrScrn.dll’)exceptException:print(“Dllloaderror!”)…

    2022年6月3日
    85
  • ofbiz 开发

    ofbiz 开发1 Ofbiz 介绍 Ofbiz http www ofbiz org 是 OpenSource 的商务软件系统 充分利用了各优秀的的 OpenSource 项目 像 Tomcat Ant BeanShell Jboss 等 构建了一个强大的系统平台 Ofbiz 已经完成了大部分商务类软件系统都需要的部件 像用户认证 工作流 商务规则处理等 Ofbiz 的核心技术在

    2026年3月19日
    2
  • Android UI布局优化之ViewStub[通俗易懂]

    Android UI布局优化之ViewStub[通俗易懂]尊重原创,转载请注明出处:http://blog.csdn.net/a740169405/article/details/50351013前言:在设计模式的单利模式中,懒汉式和饿汉式是其中两种。一种是在类被加载的时候就完成单例对象的初始化,一种是在需要使用该单例的时候才初始化。在android的视图设计中,同样需要使用的这样的设计模式。这样的视图加载起来需要耗费很多的时间。在这几…

    2022年6月28日
    36
  • offsetWidth 和 width

    offsetWidth 和 width

    2026年3月17日
    2

发表回复

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

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