Bean-获取、循环依赖

三级缓存中获取单例Bean

    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        Object singletonObject = this.singletonObjects.get(beanName);
        if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
            synchronized (this.singletonObjects) {
                singletonObject = this.earlySingletonObjects.get(beanName);
                if (singletonObject == null && allowEarlyReference) {
                    ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                    if (singletonFactory != null) {
                        singletonObject = singletonFactory.getObject();
                        this.earlySingletonObjects.put(beanName, singletonObject);
                        this.singletonFactories.remove(beanName);
                    }
                }
            }
        }
        return singletonObject;
    }

singletonObjects:beanName -> beanInstance
earlySingletonObjects:beanName -> beanInstance
singletonFactories:beanName -> ObjectFactory

定义
在创建bean的过程中发现当前bean已经在“当前创建池”里时,将抛出BeanCurrentlyInCreationEception表示循环依赖。
构造器循环依赖(createBeanInstance)
加入singletonFactories缓存的前提是执行了构造器,所以构造器的循环依赖无法解决
setter循环依赖(populateBean)
对于setter注入造成的依赖是通过Spring容器提前暴露刚完成构造器注入但未完成其他步骤的bean来完成的,而且只能解决单例作用域的bean循环依赖。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要是分析Spring bean的循环依赖,以及Spring的解决方式。 通过这种解决方式,我们可以应用在我们...
    裘马轻狂大帅阅读 1,137评论 0 1
  • 本文主要是分析Spring bean的循环依赖,以及Spring的解决方式。 通过这种解决方式,我们可以应用在我们...
    java架构_Zhang阅读 2,682评论 0 0
  • [toc] 循环依赖 循环依赖就是N个类中循环嵌套引用,如果日常开发中我们用new对象的方式发生这种循环依赖的程序...
    星空怎样阅读 2,795评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 12,188评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 13,585评论 0 11