美文网首页
Spring是如何解决循环依赖

Spring是如何解决循环依赖

作者: 不迷烟火 | 来源:发表于2020-02-05 20:36 被阅读0次

    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的引用。
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Spring是如何解决循环依赖

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