Spring的AbstractApplicationContext是ApplicationContext抽象實現類,該抽象類的refresh()方法定義了Spring容器在加載配置文件后的各項處理過程,這些處理過程清晰刻畫了Spring容器啟動時所執行的各項操作。下面,我們來看一下refresh()內部定義了哪些執行邏輯:
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.初始化singleton的Bean:實例化所有singleton的Bean,并將它們放入Spring容器的緩存中;
9.發布上下文刷新事件:創建上下文刷新事件,事件廣播器負責將些事件廣播到每個注冊的事件監聽器中。
在第3.4節中,我們觀摩了Bean從創建到銷毀的生命歷程,這些過程都可以在上面的過程中找到對應的步驟。Spring協調多個組件共同完成這個復雜的工程流程,圖5-1描述了Spring容器從加載配置文件到創建出一個完整Bean的作業流程以及參與的角色。
 |
圖5-1 IoC的流水線 |
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。
Spring容器確實堪稱一部設計精密的機器,其內部擁有眾多的組件和裝置。Spring的高明之處在于,它使用眾多接口描繪出了所有裝置的藍圖,構建好Spring的骨架,繼而通過繼承體系層層推演,不斷豐富,最終讓Spring成為有血有肉的完整的框架。所以查看Spring框架的源碼時,有兩條清晰可見的脈絡:
1)接口層描述了容器的重要組件及組件間的協作關系;
2)繼承體系逐步實現組件的各項功能。
接口層清晰地勾勒出Spring框架的高層功能,框架脈絡呼之欲出。有了接口層抽象的描述后,不但Spring自己可以提供具體的實現,任何第三方組織也可以提供不同實現, 可以說Spring完善的接口層使框架的擴展性得到了很好的保證??v向繼承體系的逐步擴展,分步驟地實現框架的功能,這種實現方案保證了框架功能不會堆積在某些類的身上,造成過重的代碼邏輯負載,框架的復雜度被完美地分解開了。
Spring組件按其所承擔的角色可以劃分為兩類:
1)物料組件:Resource、BeanDefinition、PropertyEditor以及最終的Bean等,它們是加工流程中被加工、被消費的組件,就像流水線上被加工的物料;
2)加工設備組件:ResourceLoader、BeanDefinitionReader、BeanFactoryPostProcessor、InstantiationStrategy以及BeanWrapper等組件像是流水線上不同環節的加工設備,對物料組件進行加工處理。
我們在第3章中已經介紹了Resource和ResourceLoader這兩個組件。在本章中,我們將對其他的組件進行講解。
posted on 2009-04-07 23:06
lanxin1020 閱讀(284)
評論(0) 編輯 收藏 所屬分類:
spring