Spring源码-getSingleton阅读笔记

472 阅读1分钟
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()