![]() |
2.調(diào)用工廠后處理器:根據(jù)反射機(jī)制從BeanDefinitionRegistry中找出所有BeanFactoryPostProcessor類型的Bean,并調(diào)用其postProcessBeanFactory()接口方法;
3.注冊(cè)Bean后處理器:根據(jù)反射機(jī)制從BeanDefinitionRegistry中找出所有BeanPostProcessor類型的Bean,并將它們注冊(cè)到容器Bean后處理器的注冊(cè)表中;
4.初始化消息源:初始化容器的國(guó)際化信息資源;
5.初始化應(yīng)用上下文事件廣播器;
6.初始化其他特殊的Bean:這是一個(gè)鉤子方法,子類可以借助這個(gè)鉤子方法執(zhí)行一些特殊的操作:如AbstractRefreshableWebApplicationContext就使用該鉤子方法執(zhí)行初始化ThemeSource的操作;
7.注冊(cè)事件監(jiān)聽器;
8.初始化singleton的Bean:實(shí)例化所有singleton的Bean,并將它們放入Spring容器的緩存中;
9.發(fā)布上下文刷新事件:創(chuàng)建上下文刷新事件,事件廣播器負(fù)責(zé)將些事件廣播到每個(gè)注冊(cè)的事件監(jiān)聽器中。
在第3.4節(jié)中,我們觀摩了Bean從創(chuàng)建到銷毀的生命歷程,這些過程都可以在上面的過程中找到對(duì)應(yīng)的步驟。Spring協(xié)調(diào)多個(gè)組件共同完成這個(gè)復(fù)雜的工程流程,圖5-1描述了Spring容器從加載配置文件到創(chuàng)建出一個(gè)完整Bean的作業(yè)流程以及參與的角色。
![]() |
圖5-1 IoC的流水線 |
2.BeanDefinitionReader讀取Resource所指向的配置文件資源,然后解析配置文件。配置文件中每一個(gè)<bean>解析成一個(gè)BeanDefinition對(duì)象,并保存到BeanDefinitionRegistry中;
3.容器掃描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射機(jī)制自動(dòng)識(shí)別出Bean工廠后處理器(實(shí)現(xiàn)BeanFactoryPostProcessor接口)的Bean,然后調(diào)用這些Bean工廠后處理器對(duì)BeanDefinitionRegistry中的BeanDefinition進(jìn)行加工處理。主要完成以下兩項(xiàng)工作:
1)對(duì)使用到占位符的<bean>元素標(biāo)簽進(jìn)行解析,得到最終的配置值,這意味對(duì)一些半成品式的BeanDefinition對(duì)象進(jìn)行加工處理并得到成品的BeanDefinition對(duì)象;
2)對(duì)BeanDefinitionRegistry中的BeanDefinition進(jìn)行掃描,通過Java反射機(jī)制找出所有屬性編輯器的Bean(實(shí)現(xiàn)java.beans.PropertyEditor接口的Bean),并自動(dòng)將它們注冊(cè)到Spring容器的屬性編輯器注冊(cè)表中(PropertyEditorRegistry);
4.Spring容器從BeanDefinitionRegistry中取出加工后的BeanDefinition,并調(diào)用InstantiationStrategy著手進(jìn)行Bean實(shí)例化的工作;
5.在實(shí)例化Bean時(shí),Spring容器使用BeanWrapper對(duì)Bean進(jìn)行封裝,BeanWrapper提供了很多以Java反射機(jī)制操作Bean的方法,它將結(jié)合該Bean的BeanDefinition以及容器中屬性編輯器,完成Bean屬性的設(shè)置工作;
6.利用容器中注冊(cè)的Bean后處理器(實(shí)現(xiàn)BeanPostProcessor接口的Bean)對(duì)已經(jīng)完成屬性設(shè)置工作的Bean進(jìn)行后續(xù)加工,直接裝配出一個(gè)準(zhǔn)備就緒的Bean。
Spring容器確實(shí)堪稱一部設(shè)計(jì)精密的機(jī)器,其內(nèi)部擁有眾多的組件和裝置。Spring的高明之處在于,它使用眾多接口描繪出了所有裝置的藍(lán)圖,構(gòu)建好Spring的骨架,繼而通過繼承體系層層推演,不斷豐富,最終讓Spring成為有血有肉的完整的框架。所以查看Spring框架的源碼時(shí),有兩條清晰可見的脈絡(luò):
1)接口層描述了容器的重要組件及組件間的協(xié)作關(guān)系;
2)繼承體系逐步實(shí)現(xiàn)組件的各項(xiàng)功能。
接口層清晰地勾勒出Spring框架的高層功能,框架脈絡(luò)呼之欲出。有了接口層抽象的描述后,不但Spring自己可以提供具體的實(shí)現(xiàn),任何第三方組織也可以提供不同實(shí)現(xiàn), 可以說Spring完善的接口層使框架的擴(kuò)展性得到了很好的保證。縱向繼承體系的逐步擴(kuò)展,分步驟地實(shí)現(xiàn)框架的功能,這種實(shí)現(xiàn)方案保證了框架功能不會(huì)堆積在某些類的身上,造成過重的代碼邏輯負(fù)載,框架的復(fù)雜度被完美地分解開了。
Spring組件按其所承擔(dān)的角色可以劃分為兩類:
1)物料組件:Resource、BeanDefinition、PropertyEditor以及最終的Bean等,它們是加工流程中被加工、被消費(fèi)的組件,就像流水線上被加工的物料;
2)加工設(shè)備組件:ResourceLoader、BeanDefinitionReader、BeanFactoryPostProcessor、InstantiationStrategy以及BeanWrapper等組件像是流水線上不同環(huán)節(jié)的加工設(shè)備,對(duì)物料組件進(jìn)行加工處理。
我們?cè)诘?章中已經(jīng)介紹了Resource和ResourceLoader這兩個(gè)組件。在本章中,我們將對(duì)其他的組件進(jìn)行講解。