美文网首页
Spring-5-IoC循环依赖

Spring-5-IoC循环依赖

作者: 宠辱不惊的咸鱼 | 来源:发表于2019-10-04 09:33 被阅读0次

getBean的粗略分步

  • 三个步骤
    • createBeanInstance:实例化
    • populateBean:依赖处理
    • initializeBean:初始化

处理方式

  • 非构造器
    • 在缓存那个地方,有三级缓存架构
      • 一级缓存:singletonObjects
      • 二级缓存:earlySingletonObjects
      • 三级缓存:singletonFactories
    • 在postProcessMergedBeanDefinition之后,populateBean之前,有一个操作DefaultSingletonBeanRegistry.addSingletonFactory,也就是说加入三级缓存
    • 案例:Bean1依赖Bean2,Bean2依赖Bean1;先获取Bean1
    • Bean1在三个缓存中都找不到,创建Bean1,加入三级缓存;populateBean的时候,依赖Bean2,所以先去获取Bean2
    • Bean2在三个缓存中都找不到,创建Bean2,加入三级缓存;populateBean的时候,依赖Bean1,所以又去获取Bean1
    • 首先,一级缓存中没有,isSingletonCurrentlyInCreation为true,进入同步块(这儿采用一级缓存作为同步对象)
    • 然后在二级缓存中查找下Bean1,也没有
    • allowEarlyReference,这个变量什么情况下会变成false???
    • 查找三级缓存,找到了singletonFactory(AbstractAutowireCapableBeanFactory),调用singletonFactory.getObject,得到了不完整的Bean1,加入二级缓存,从三级缓存中移除
    • 那么这个时候,Bean2的依赖注入就可以完成了,虽然里面的Bean1是个不完整的;Bean2先走完getBean
    • 回到Bean1的populateBean中,Bean1的getBean也走完了
    • 这个时候:一级缓存有Bean1和Bean2;二级缓存没有,二级缓存中是什么时候被移除的呢
    • AbstractBeanfactory的mbd.isSingleton()下面的getSingleton(beanName, new ObjectFactory<Object>()那里
  • 构造器
    • Bean1在构造器中依赖Bean2,Bean2也在构造器中依赖Bean1,跪
    • Bean1在构造器中依赖Bean2,Bean2在属性依赖Bean1,不会有问题的
      • Bean1在获取构造器参数的时候,会去调用getBean(Bean2),原理上和populateBean是一致的,只是时间点有区别,在createBeanInstance里面
  • prototype也能处理循环依赖吗?how?

相关文章

  • Spring-5-IoC循环依赖

    getBean的粗略分步 三个步骤createBeanInstance:实例化populateBean:依赖处理i...

  • Spring 是如何解决循环依赖的?

    Spring 是如何解决循环依赖的? 循环依赖: Spring 循环依赖有三种情况: 构造器的循环依赖,这种依赖 ...

  • Spring-IOC-循环依赖检测与Bean的创建

    Spring容器的循环依赖检测 Spring容器循环依赖包括:构造器循环依赖和setter循环依赖。 1- 构造器...

  • Spring 对于循环依赖的处理

    什么是循环依赖 循环依赖就是循环引用,就是两个或者多个bean相互之间的持有对方。 循环依赖的类型 构造器循环依赖...

  • Spring源码解析之循环依赖

    什么是循环依赖 简单的说就是A依赖B,B依赖C,C依赖A这样就构成了循环依赖 循环依赖分为构造器依赖和属性依赖,众...

  • 一文详解Spring中的循环依赖,面试必杀技

    目录 前言 什么是循环依赖? 什么情况下循环依赖可以被处理? Spring是如何解决的循环依赖? 简单的循环依赖(...

  • Spring之循环依赖及解决方式

    1.Spring循环依赖 循环依赖指Spring对象之间的循环引用,最终形成死循环。举例: A依赖于B,B依赖于C...

  • 循环依赖

    循环依赖 1、循环依赖的介绍 循环依赖,bean之间相互持有各自的引用,最终形成闭环。比如 bean的实例化有如下...

  • 循环依赖

    https://zhuanlan.zhihu.com/p/62382615[https://zhuanlan.zh...

  • 循环依赖

    循环依赖就是N个类中循环嵌套引用,先考虑一下,面对对面编程,这是一个自然的概念吗?你中有我,我中有你,面向对象。如...

网友评论

      本文标题:Spring-5-IoC循环依赖

      本文链接:https://www.haomeiwen.com/subject/zlwjpctx.html