Spring 啓動時讀取應用程序提供的Bean配置信息,並在Spring容器中生成一份相應的Bean配置註冊表,而後根據這張註冊表實例化Bean,裝配號Bean之間的依賴關係,爲上層應用提供準備就緒的運行環境。java
該圖描述了Spring容器從加載配置文件到建立出一個完整Bean的做業流程:app
1、ResourceLoader從存儲介質中加載Spring配置信息,並使用Resource表示這個配置文件的資源;框架
2、BeanDefinitionReader讀取Resource所指向的配置文件資源,而後解析配置文件。配置文件中每個<bean>解析成一個BeanDefinition對象,並保存到BeanDefinitionRegistry中;編輯器
3、容器掃描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射機制自動識別出Bean工廠後處理後器(實現BeanFactoryPostProcessor接口)的Bean,而後調用這些Bean工廠後處理器對BeanDefinitionRegistry中的BeanDefinition進行加工處理。主要完成如下兩項工做:spa
1)對使用到佔位符的<bean>元素標籤進行解析,獲得最終的配置值,這意味對一些半成品式的BeanDefinition對象進行加工處理並獲得成品的BeanDefinition對象;設計
2)對BeanDefinitionRegistry中的BeanDefinition進行掃描,經過Java反射機制找出全部屬性編輯器的Bean(實現java.beans.PropertyEditor接口的Bean),並自動將它們註冊到Spring容器的屬性編輯器註冊表中(PropertyEditorRegistry);對象
4.Spring容器從BeanDefinitionRegistry中取出加工後的BeanDefinition,並調用InstantiationStrategy着手進行Bean實例化的工做;blog
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 企業應用實戰》