Spring容器高級主題

5.1 Spring容器技術內幕

5.1.1 內部工作機制

Spring的AbstractApplicationContext是ApplicationContext抽象實現類,該抽象類的refresh()方法定義了Spring容器在加載配置文件後的各項處理過程,這些處理清晰刻畫了Spring容器啓動時所執行的各項操作。

代碼清單 AbstractApplicationContext#refresh()

//1初始化BeanFactory

ConfigurableListableBeanFactory beanFactory = getBeanFactory();

...
//2調用工廠後處理器
invokeBeanFactoryPostProcessors();
//3註冊Bean後處理器
registerBeanPostProcessors();
//4初始化消息源
initMessageSource();
//5初始化應用上下文事件廣播器
initApplicationEventMulticaster();
//6初始化其他特殊的Bean:由具體子類實現
onRefresh();
//7註冊事件監聽器
registerListeners();
//8初始化所有單實例的Bean,使用懶漢模式的Bean除外
finishBeanFactoryInitialization(beanFactory);
//9完成刷新併發布容器刷新事件
finishRefresh();

1、初始化BeanFactory:根據配置文件實例化BeanFactory,getBeanFactory()方法由具體子類實現。這一步,Spring將配置文件信息裝入容器的Bean定義註冊表(BeanDefinitionRegistry)中,此時Bean還未初始化。

2、調用工廠後處理器:根據反射機制從BeanDefinitionRegistry中找出所有BeanFactoryPostProcessor類型的Bean,並調用其postProcessBeanFactory()接口方法;

3、註冊Bean後處理:根據反射機制從BeanDefinitionRegistry中找出所有BeanPostProcessor類型的Bean,並將他們註冊到容器Bean後處理的註冊表中;

4、初始化消息源:初始化容器的國際化消息資源;

5、初始化應用上下文事件廣播器;

6、初始化其他特殊的Bean:這是一個鉤子方法,子類可以藉助這個方法執行一些特殊操作:如AbstractRefreshableWebApplicationContext就使用該方法執行初始化ThemeSource的操作;

7、註冊事件監聽器;

8、初始化所有單實例的Bean,使用懶漢模式的Bean除外:初始化Bean後,將他們放入Spring容器的緩存中;

9、發佈上下文刷新事件:創建上下文刷新事件,事件廣播器負責將這些事件廣播到每個註冊的事件監聽器中。


1、ResourceLoader從存儲介質中加載Spring配置信息,並使用Resource表示這個配置文件的資源;

2、BeanDefinitionReader讀取Resource所指向的配置文件資源,然後解析配置文件。配置文件中每一個<bean>解析成一個BeanDefinition對象,並保存到BeanDefinitionRegistry中;

3、容器掃描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射機制自動識別出Bean工廠後處理器(實現BeanFactoryPostProcessor接口)的Bean,然後調用這些Bean工廠後處理器對BeanDefinitionRegistry中的BeanDefinition進行加工處理,主要完成兩項工作:

1)對使用佔位符的<bean>元素標籤進行解析,得到最終配置值,意味着對一些半成品的BeanDefinition對象進行加工處理並得到成品的BeanDefinition對象;

2)對BeanDefinitionRegistry中的BeanDefinition進行掃描,通過Java反射機制找出所有屬性編輯器的Bean(實現java.beans.PropertyEditor接口的Bean),並自動將他們註冊到Spring容器的屬性編輯器註冊表中(PropertyEditorRegistry);

4、Spring容器從BeanDefinitionRegistry中取出加工後的BeanDefinition,並調用InstantiationStrategy着手進行Bean實例化的工作;

5、在實例化Bean時,Spring容器使用BeanWrapper對Bean進行封裝,BeanWrapper提供很多以Java反射機制操作Bean的方法,將結合該Bean的BeanDefinition以及容器中屬性編輯器,完成Bean屬性的設置工作;

6、利用容器中註冊的Bean後處理器(實現BeanPostProcessor接口的Bean)對已經完成屬性設置工作的Bean進行後續加工,直接裝配出一個準備就緒的Bean。

發佈了6 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章