Spring源碼深度解析-第6章《容器的功能擴展》總結

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事件,以保證對應的監聽器可以做進一步的邏輯處理。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章