天天看點

Spring IOC啟動分析 二 Bean的生命周期即Bean執行個體化的過程

0、從AnnotationConfigApplicationContext到getBean(String beanName)的過程

Spring IOC啟動分析 二 Bean的生命周期即Bean執行個體化的過程

1、分析Bean執行個體化過程的入口 

org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String beanName)
           

2.Bean執行個體化過程的流程圖

Spring IOC啟動分析 二 Bean的生命周期即Bean執行個體化的過程

3、在這裡介紹Spring容器中三個緩存設定的地方,以便于後面分析

1)  singletonObjects:單例緩存池,裡面存儲的是完整的Bean執行個體化後的對象
           
//key    是bean執行個體的名稱
//value  是Bean執行個體化後的完整的對象
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
           
2) singletonFactories: 單例工廠緩存池,裡面存儲的是早期的Bean執行個體化後的非完整對象,即還沒有設定屬性的對象
           
//key    是bean執行個體的名稱
//value  是一個ObjectFactory接口,其實作了一個getObject方法
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
           

    其value值的實作類的方法為:

new ObjectFactory<Object>() {
	@Override
	public Object getObject() throws BeansException {
		return getEarlyBeanReference(beanName, mbd, bean);
	}
}
//第一個參數是bean執行個體的名稱
//第二個參數是正在建立的Bean執行個體的bean定義
//第三個參數是早期的bean執行個體對象,就是還沒有設定屬性的bean執行個體對象
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
	Object exposedObject = bean;
	if (bean != null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
				SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
				exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
				if (exposedObject == null) {
					return null;
				}
			}
		}
	}
	return exposedObject;
}
           
3)  earlySingletonObjects:早期的bean執行個體緩存池
           
//key    是bean執行個體的名稱
//value  是早期的Bean執行個體,不完整的bean執行個體對象,還沒有設定屬性的Bean執行個體對象
private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
           

4、 上面三個緩存的添加時序圖

       三個緩存的關系,是互斥的,也就說一個Bean執行個體對象隻會存在三個緩存中某一個緩存中,不會同時存在兩個或兩個以上的緩存中去

Spring IOC啟動分析 二 Bean的生命周期即Bean執行個體化的過程

5、補充

Spring IOC啟動分析 二 Bean的生命周期即Bean執行個體化的過程

Spring IOC啟動分析 二 Bean的生命周期即Bean執行個體化的過程