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;
}
可以从这个方法中看到doGetBean的一部分加载顺序,该方法依次从 singletonObjects -> earlySingletonObjects -> singletonFactories 中获取bean
- singletonObjects:用于保存BeanName和创建Bean实例之间的关系
- earlySingletonObjects:同样用于保存BeanName和创建Bean实例之间的关系,但是与singletonObjects不同的地方在于,当一个单例的Bean被放入这里后,当bean还在创建过程中,就可以通过getBean方法获取到了,其目的主要是用来检测循环引用(如何做到的?)
- singletonFactories:用于保存BeanName和创建Bean的工厂之间的关系,即beanName -> ObjectFactory 因此在获取到ObjectFactory后还需要调用getObject()才能获取到Bean
注意在调用 ObjectFactory.getObject() 获取到bean后,还需依次调用earlySingletonObjects.put(),singletonFactories.remove()