
圖4.Bean工廠的繼承關(guān)系
BeanFactory有三個(gè)子類:ListableBeanFactory、HierarchicalBeanFactory和Autowire Capable Bean Factory。但是從上圖中我們可以發(fā)現(xiàn)最終的默認(rèn)實(shí)現(xiàn)類是DefaultListableBeanFactory,他實(shí) 現(xiàn)了所有的接口。那為何要定義這么多層次的接口呢?查閱這些接口的源碼和說明發(fā)現(xiàn),每個(gè)接口都有他使用的場(chǎng)合,它主要是為了區(qū)分在Spring內(nèi)部在操作過程中對(duì)象的傳遞和轉(zhuǎn)化過程中,對(duì)對(duì)象的 數(shù)據(jù)訪問所做的限制。例如ListableBeanFactory接口表示這些Bean是可列表的,而HierarchicalBeanFactory表示的是這些Bean是有繼承關(guān)系的,也就是每個(gè)Bean有可能有父Bean。 AutowireCapableBeanFactory接口定義Bean的自動(dòng)裝配規(guī)則。這四個(gè)接口共同定義了Bean的集合、Bean之間的關(guān)系、以及Bean行為。
Bean的定義主要有BeanDefinition描述,如下圖說明了這些類的層次關(guān)系:

圖5.Bean定義的類層次關(guān)系圖
Bean的定義就是完整的描述了在Spring的配置文件中你定義的節(jié)點(diǎn)中所有的信息,包括各種子節(jié)點(diǎn)。當(dāng)Spring成功解析你定義的一個(gè)節(jié)點(diǎn)后,在Spring的內(nèi)部他就被轉(zhuǎn)化 成BeanDefinition對(duì)象。以后所有的操作都是對(duì)這個(gè)對(duì)象完成的。
Bean的解析過程非常復(fù)雜,功能被分的很細(xì),因?yàn)檫@里需要被擴(kuò)展的地方很多,必須保證有足夠的靈活性,以應(yīng)對(duì)可能的變化。Bean的解析主要就是對(duì)Spring配置文件的解析。這個(gè)解析過程主要通過 下圖中的類完成:

圖6.Bean的解析類
當(dāng)然還有具體對(duì)tag的解析這里并沒有列出。
Context組件
Context在Spring的org.springframework.context包下,前面已經(jīng)講解了Context組件在Spring中的作用,他實(shí)際上就是給Spring提供一個(gè)運(yùn)行時(shí)的環(huán)境,用以保存各個(gè)對(duì)象的狀態(tài)。下面看一下這個(gè) 環(huán)境是如何構(gòu)建的。
ApplicationContext是Context的頂級(jí)父類,他除了能標(biāo)識(shí)一個(gè)應(yīng)用環(huán)境的基本信息外,他還繼承了五個(gè)接口,這五個(gè)接口主要是擴(kuò)展了Context的功能。下面是Context的類結(jié)構(gòu)圖:

圖7.Context相關(guān)的類結(jié)構(gòu)圖
從上圖中可以看出ApplicationContext繼承了BeanFactory,這也說明了Spring容器中運(yùn)行的主體對(duì)象是Bean,另外ApplicationContext繼承了ResourceLoader接口,使得ApplicationContext可以訪 問到任何外部資源,這將在Core中詳細(xì)說明。
ApplicationContext的子類主要包含兩個(gè)方面:
ConfigurableApplicationContext表示該Context是可修改的,也就是在構(gòu)建Context中用戶可以動(dòng)態(tài)添加或修改已有的配置信息,它下面又有多個(gè)子類,其中最經(jīng)常使用的是可更新的Context,即 AbstractRefreshableApplicationContext類。
WebApplicationContext顧名思義,就是為web準(zhǔn)備的Context他可以直接訪問到ServletContext,通常情況下,這個(gè)接口使用的少。
再往下分就是按照構(gòu)建Context的文件類型,接著就是訪問Context的方式。這樣一級(jí)一級(jí)構(gòu)成了完整的Context等級(jí)層次。
總體來說ApplicationContext必須要完成以下幾件事:
◆標(biāo)識(shí)一個(gè)應(yīng)用環(huán)境
◆利用BeanFactory創(chuàng)建Bean對(duì)象
◆保存對(duì)象關(guān)系表
◆能夠捕獲各種事件
Context作為Spring的Ioc容器,基本上整合了Spring的大部分功能,或者說是大部分功能的基礎(chǔ)。
Core組件
Core組件作為Spring的核心組件,他其中包含了很多的關(guān)鍵類,其中一個(gè)重要組成部分就是定義了資源的訪問方式。這種把所有資源都抽象成一個(gè)接口的方式很值得在以后的設(shè)計(jì)中拿來學(xué)習(xí)。下面就 重要看一下這個(gè)部分在Spring的作用。
下圖是Resource相關(guān)的類結(jié)構(gòu)圖:

圖8.Resource相關(guān)的類結(jié)構(gòu)圖
從上圖可以看出Resource接口封裝了各種可能的資源類型,也就是對(duì)使用者來說屏蔽了文件類型的不同。對(duì)資源的提供者來說,如何把資源包裝起來交給其他人用這也是一個(gè)問題,我們看到Resource 接口繼承了InputStreamSource接口,這個(gè)接口中有個(gè)getInputStream方法,返回的是InputStream類。這樣所有的資源都被可以通過InputStream這個(gè)類來獲取,所以也屏蔽了資源的提供者。另外還有一 個(gè)問題就是加載資源的問題,也就是資源的加載者要統(tǒng)一,從上圖中可以看出這個(gè)任務(wù)是由ResourceLoader接口完成,他屏蔽了所有的資源加載者的差異,只需要實(shí)現(xiàn)這個(gè)接口就可以加載所有的資源, 他的默認(rèn)實(shí)現(xiàn)是DefaultResourceLoader。