三级缓存中获取单例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循环依赖。