1. 程式人生 > >Spring容器初始化過程

Spring容器初始化過程

https://blog.csdn.net/xingxing513234072/article/details/78247480

一、Spring 容器高層檢視

 

Spring 啟動時讀取應用程式提供的Bean配置資訊,並在Spring容器中生成一份相應的Bean配置登錄檔,然後根據這張登錄檔例項化Bean,裝配號Bean之間的依賴關係,為上層應用提供準備就緒的執行環境。

二、內部工作機制

該圖描述了Spring容器從載入配置檔案到創建出一個完整Bean的作業流程:

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完善的介面層使框架的擴充套件性得到了很好的保證。縱向繼承體系的逐步擴充套件,分步驟地實現框架的功能,這種實現方案保證了框架功能不會堆積在某些類的身上,造成過重的程式碼邏輯負載,框架的複雜度被完美地分解開了。

Spring元件按其所承擔的角色可以劃分為兩類:

1)物料元件:Resource、BeanDefinition、PropertyEditor以及最終的Bean等,它們是加工流程中被加工、被消費的元件,就像流水線上被加工的物料;

2)加工裝置元件:ResourceLoader、BeanDefinitionReader、BeanFactoryPostProcessor、InstantiationStrategy以及BeanWrapper等元件像是流水線上不同環節的加工裝置,對物料元件進行加工處理。

 

摘錄於《Spring 3.x 企業應用實戰》