Spring啟動時執行的操作
AbstractApplicationContext是ApplicationContext的抽象實現類,它的refresh方法定義了Spring啟動時執行的操作。
AbstractApplicationContext中refresh()方法源碼片段
使用設計模式的模版模式
//初始化BeanFacoty
prepareRefresh();
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
prepareBeanFactory(beanFactory);
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// 調用后工廠后置處理器
invokeBeanFactoryPostProcessors(beanFactory);
// 注冊Bean后置處理器
registerBeanPostProcessors(beanFactory);
// 初始化消息源
initMessageSource();
// 初始化容器事件廣播器
initApplicationEventMulticaster();
// 初始化其他特殊的Bean,這是個鉤子方法,子類中具體實現
onRefresh();
// 注冊事件監聽器
registerListeners();
// 初始化所有單例的Bean
finishBeanFactoryInitialization(beanFactory);
//完成刷新并發布容器刷新事件
finishRefresh();
ResourceLoader從存儲介質中加載spring配置信息,并使用Resource標識這個配置文件的資源。
BeanDefinitionReader讀取Resource所指向的配置文件資源,然后解析配置文件,配置文件中的每一個<bean>被解析成一個BeanDefinition對象,并保存到BeanDefinitionRegistry中。
容器掃描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射機制自動識別出Bean工廠后處理器的Bean,然后調用這些Bean工廠處理器對BeanDefinfitionRegistry中的BeanDefinition進行加工處理,主要完成兩項工作:
(1)對使用到占位符的<bean>元素標簽進行解析,得到最終的配置項,這意味著一些半成品額BeanDefinition對象加工處理并得到完整的BeanDefinition對象。
(2)對BeanDefinitionRegistry中的BeanDefinition進行掃描,通過Java反射機制找出所有屬性編輯器的Bean,并自動將他們注冊到Spring容器的屬性編輯器注冊表中。
Spring容器從BeanDefinitionRegistry中取出加工后的BeanDefinition,并調用InstantiationStrategy著手進行Bean實例化的工作。
在實例化Bean時,Spring容器使用BeanWrapper對Bean進行封裝,BeanWrapper提供了很多以Java反射機制操作Bean的方法,它將結合Bean的BeanDefinition以及容器中的屬性編輯器,完成Bean屬性的設置工作。
利用容器中注冊的Bean后處理器對已經完成屬性設置工作的Bean進行后續加工,直接裝配出一個準備就緒的Bean。