0、從AnnotationConfigApplicationContext到getBean(String beanName)的過程
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90TUhhmUzoVd5cUYwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwUDO1MTNwkDMwIjNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1、分析Bean執行個體化過程的入口
org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String beanName)
2.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執行個體對象隻會存在三個緩存中某一個緩存中,不會同時存在兩個或兩個以上的緩存中去