1、ClassPathXMLApplicationContext初始化的步驟
1)初始化前的準備工作,例如對系統屬性或者環境變量進行準備及驗證;
2)初始化BeanFactory,並進行XML文件讀取;
3)對beanFactory進行各種功能填充;
4)子類覆蓋方法做額外的處理;
5)激活各種BeanFactory處理器;
6)註冊攔截bean創建的bean處理器;
7)爲上下文初始化Message源;
8)初始化應用消息廣播器;
9)留給子類來初始化其他的bean;
10)在所有註冊的bean中查找listener bean,註冊到消息廣播器中;
11)初始化剩下的單實例(非惰性的);
12)完成刷新過程。
2、環境準備prepareRefresh
1)initPropertySource正符合Spring的開放式結構設計,給用戶最大擴展Spring的能力;
2)validateRequiredProperties則是對屬性進行驗證。
3、加載BeanFactory
- obtainFreshBeanFactory步驟:
1)創建DefaultListableBeanFactory;
2)指定序列化ID;
3)定製FactoryBean;
4)加載BeanDefinition;
‘5)使用全局變量記錄BeanFac
4、功能擴展
- 增加SPEL語言的支持
- 增加屬性註冊編輯器
- 添加ApplicationContextAwareProcessor處理器
- 設置忽略依賴
- 註冊依賴
5、BeanFactory的後處理
- BeanPostProcessor和BeanFactoryPostProcessor:如果你想改變實際的bean實例,那麼你最好使用BeanPostProcessor。同樣的,BeanFactoryPostProcessor的作用範圍是容器級的。
- PropertyPlaceholderConfigurer:PropertyPlaceholderConfigurer間接繼承了BeanFactoryPostProssor接口,當Spring加載任何實現了這個接口的bean的配置時,都會在bean工廠載入所有bean的配置之後執行postProcessBeanFactory方法。正是通過事項BeanFactoryPostProcessor接口,BeanFactory會在實例化任何bean之前獲得配置信息,從而能夠正確解析bean描述文件中的變量引用。
- 激活BeanFactoryPostProcessor:從上面的方法我們可以看到,對於BeanFactoryPostProcessor的處理主要分爲兩種情況進行,一個是對於BeanDefinitionRegistry類的特殊處理,另一種是對普通的BeanFactoryPostProcessor進行處理。
對於BeanDefinitionRegistry類型的處理類的處理主要包括以下內容:
1)對於硬編碼註冊的後處理器的處理,主要是通過AbstractApplicationContext中的添加處理器方法addBeanFactoryPostProcessor進行添加;
2)記錄後的處理器主要使用3個Lis完成:
a.registryPostProcessors:記錄通過硬編碼方式註冊的BeanDefinitionRegistryPostProcessor類型的處理器;
b.regularPostProcessors:記錄通過硬編碼方式註冊的BeanFactoryPostProcessor類型的處理器;
c.registryPostProcessorBeans:記錄通過配置方式註冊的BeanDefinitionRegistryPostProcessor類型的處理器。
3)對以上記錄的List中的後處理器進行統一調用BeanFactoryPostProcessor的postProcessorBeanFactry方法;
4)對BeanFactoryPostProcessor中非BeanDefinitionRegisrtyPostProcessor類型的後處理器進行統一的BeanFactoryPostProcessor的postProcessorBeanFactory進行調用;
5)普通BeanFactory的處理。
- 註冊BeanPostProcessor:
ApplicationContext中添加了自動註冊的功能,這個特性是在registerBeanPostProcessor方法中完成的:
1)註冊實現所有的PriorityOrdered的BeanPostProcessor;
2)註冊實現所有實現Ordered的BeanPostProcessor;
3)註冊所有無序的BeanPostProcessor;
4)註冊所有MergedBeanDefinitionPostProcessor類型的BeanPostProcessor。
對於BeanFactoryPostProcessor的處理要區分兩種情況,一種方式是通過硬編碼方式的處理,另一種是通過配置文件方式的處理;而BeanPostProcessor的處理中只考慮了配置文件的方式。因爲對於BeanFactoryPostProcessor的處理,不但要實現註冊功能,而且還要實現對後處理器的激活操作,所以需要載入配置中的定義,並進行激活;而對於BeanPostProcessor並不需要馬上調用,硬編碼的方式實現的功能是將後處理器提取並調用。
6、初始化非延遲加載單例
完成BeanFactory的初始化工作,其中包括ConversionService的設置、配置凍結以及費延遲加載的bean的初始化工作。
1)ConversionService的設置:之前我們提到過使用自定義類型轉換器從String轉換爲Date的方式,那麼在Spring中還提供了另一種轉換方式:使用Converter;
2)凍結配置:凍結所有的bean定義,說明註冊的bean定義將不被修改或進行任何進一步的處理;
3)初始化非延遲加載:ApplicationContext實現的默認行爲就是在啓動時將所有單例bean提前進行實例化。提前實例化意味着作爲初始化過程的一部分,ApplicationContext實例會創建並配置所有的單例bean。
7、finishRefresh
在Spring中還提供了Lifecycle接口,LifeCycle中包含了strat/stop方法,實現此接口後Spring會保證在啓動的時候調用其start方法開始生命週期,並在Spring關閉的時候調用stop方法來結束生命週期,通常用來配置後臺程序,在啓動後一直運行(如對MQ進行輪詢等):
1)initLifecycleProcessor:當ApplicationContext啓動或停止時,它會通過LifecycleProcessor來與所有聲明的bean的週期做狀態更新,而在LifecycleProcessor的使用前首先需要初始化;
2)onRefresh:啓動所有實現了Lifecycle接口的bean;
3)publishEvent:當完成ApplicationContext初始化的時候,要通過Spring中的事件發佈機制來發出ContextRefreshedEvent事件,以保證對應的監聽器可以做進一步的邏輯處理。