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的引用。
}
}
}
网友评论