Spring是如何解决循环依赖

1.首先Spring scope有多种类型,single,prototype,request, session等,其中只有single支持循环依赖,并且如果有@Dependon, 那么也不支持循环依赖(可以思考一下为什么只有单例支持循环依赖)

1.循环依赖是如何解决的,主要在于AbstractBeanFactory.doGetBean()中的两个方法
DefaultSingletonBeanRegistry.getSingle(String beanName, boolean allowEarlyReference)

DefaultSingletonBeanRegistry.getSingle(String beanName, ObjectFactory<?> singletonFactory) ,
其实我觉的最重要循环依赖拿到的该对象的引用,所以其实没有完全实例完也没关系。

如果A依赖B B依赖A
A先调用DefaultSingletonBeanRegistry.getSingle(String beanName, boolean allowEarlyReference) {
    ==> {
        singletonObjects 无找
        earlySingletonObjects 无找
        singletonFactories 无的话调用下面这个方法,有直接返回单例bean并放入earlySingletonObjects中。
    }
}
仍然未拿到对象则说明未被创建过则调用:
DefaultSingletonBeanRegistry.getSingle(String beanName, ObjectFactory<?> singletonFactory) 
==> 1.singletonObjects 无
==> 2. 创建实例, singletonsCurrentlyInCreation.add(beanName) 打上正在创建的标
==> 3. createBean {
    ==> doCreateBean {
        ==> 1.createBeanInstance 创建一个对应的实例
        ==> 2.earlySingletonExposure==true,则add到singletonFactories中(挺重要){
            // bean 就是 A的引用
            getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
                SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference(exposedObject,                beanName);
            }   
        }
        ==> populateBean(beanName, mbd, instanceWrapper) {
          如何依赖B那么实例化B调用getSingle(A, true) 则可以在singletonFactories中拿到A,并且将A放入到earlySingletonObjects(起到缓存的作用)中。其实核心还是拿的A的引用。
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容