隨筆 - 63  文章 - 0  trackbacks - 0
          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          Spring的AbstractApplicationContext是ApplicationContext抽象實(shí)現(xiàn)類,該抽象類的refresh()方法定義了Spring容器在加載配置文件后的各項(xiàng)處理過程,這些處理過程清晰刻畫了Spring容器啟動(dòng)時(shí)所執(zhí)行的各項(xiàng)操作。下面,我們來看一下refresh()內(nèi)部定義了哪些執(zhí)行邏輯:
          1.初始化BeanFactory:根據(jù)配置文件實(shí)例化BeanFactory,getBeanFactory()方法由具體子類實(shí)現(xiàn)。在這一步里,Spring將配置文件的信息裝入到容器的Bean定義注冊(cè)表(BeanDefinitionRegistry)中,但此時(shí)Bean還未初始化;
          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的流水線
          1.ResourceLoader從存儲(chǔ)介質(zhì)中加載Spring配置文件,并使用Resource表示這個(gè)配置文件的資源;
          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)行講解。
          posted on 2009-04-07 23:06 lanxin1020 閱讀(286) 評(píng)論(0)  編輯  收藏 所屬分類: spring
          主站蜘蛛池模板: 耒阳市| 肥西县| 奉节县| 资兴市| 同江市| 平远县| 扶沟县| 铜川市| 蒲城县| 弥渡县| 胶南市| 白城市| 紫云| 潼关县| 舞阳县| 古田县| 孟村| 江北区| 任丘市| 兴国县| 通辽市| 平度市| 商南县| 汾阳市| 昌乐县| 德昌县| 彭阳县| 灵丘县| 光山县| 英吉沙县| 丽水市| 德昌县| 福贡县| 宣威市| 哈密市| 新丰县| 吉首市| 菏泽市| 乌拉特后旗| 舞钢市| 永康市|