<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    Spring的AbstractApplicationContext是ApplicationContext抽象實現類,該抽象類的refresh()方法定義了Spring容器在加載配置文件后的各項處理過程,這些處理過程清晰刻畫了Spring容器啟動時所執行的各項操作。下面,我們來看一下refresh()內部定義了哪些執行邏輯:
    1.初始化BeanFactory:根據配置文件實例化BeanFactory,getBeanFactory()方法由具體子類實現。在這一步里,Spring將配置文件的信息裝入到容器的Bean定義注冊表(BeanDefinitionRegistry)中,但此時Bean還未初始化;
    2.調用工廠后處理器:根據反射機制從BeanDefinitionRegistry中找出所有BeanFactoryPostProcessor類型的Bean,并調用其postProcessBeanFactory()接口方法;
    3.注冊Bean后處理器:根據反射機制從BeanDefinitionRegistry中找出所有BeanPostProcessor類型的Bean,并將它們注冊到容器Bean后處理器的注冊表中;
    4.初始化消息源:初始化容器的國際化信息資源;
    5.初始化應用上下文事件廣播器;
    6.初始化其他特殊的Bean:這是一個鉤子方法,子類可以借助這個鉤子方法執行一些特殊的操作:如AbstractRefreshableWebApplicationContext就使用該鉤子方法執行初始化ThemeSource的操作;
    7.注冊事件監聽器;
    8.初始化singleton的Bean:實例化所有singleton的Bean,并將它們放入Spring容器的緩存中;
    9.發布上下文刷新事件:創建上下文刷新事件,事件廣播器負責將些事件廣播到每個注冊的事件監聽器中。
    在第3.4節中,我們觀摩了Bean從創建到銷毀的生命歷程,這些過程都可以在上面的過程中找到對應的步驟。Spring協調多個組件共同完成這個復雜的工程流程,圖5-1描述了Spring容器從加載配置文件到創建出一個完整Bean的作業流程以及參與的角色。
    圖5-1  IoC的流水線
    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完善的接口層使框架的擴展性得到了很好的保證??v向繼承體系的逐步擴展,分步驟地實現框架的功能,這種實現方案保證了框架功能不會堆積在某些類的身上,造成過重的代碼邏輯負載,框架的復雜度被完美地分解開了。
    Spring組件按其所承擔的角色可以劃分為兩類:
    1)物料組件:Resource、BeanDefinition、PropertyEditor以及最終的Bean等,它們是加工流程中被加工、被消費的組件,就像流水線上被加工的物料;
    2)加工設備組件:ResourceLoader、BeanDefinitionReader、BeanFactoryPostProcessor、InstantiationStrategy以及BeanWrapper等組件像是流水線上不同環節的加工設備,對物料組件進行加工處理。
    我們在第3章中已經介紹了Resource和ResourceLoader這兩個組件。在本章中,我們將對其他的組件進行講解。
    posted on 2009-04-07 23:06 lanxin1020 閱讀(284) 評論(0)  編輯  收藏 所屬分類: spring
    主站蜘蛛池模板: 亚洲午夜精品久久久久久人妖| 亚洲成av人在片观看| 亚洲成色在线影院| 久久国产免费直播| 成人午夜亚洲精品无码网站 | 亚洲日本乱码一区二区在线二产线| 国产情侣久久久久aⅴ免费| 亚洲深深色噜噜狠狠爱网站| 中文字幕不卡免费高清视频| 亚洲精品乱码久久久久久| 国产无遮挡无码视频免费软件| 日韩亚洲人成在线综合日本| 国产精品白浆在线观看免费| 亚洲美女视频一区| 在线观看H网址免费入口| 亚洲国产最大av| 日韩成人免费视频播放| 美女的胸又黄又www网站免费| 亚洲精品国产精品国自产观看| 黄色网页在线免费观看| 内射干少妇亚洲69XXX| 久久不见久久见中文字幕免费| 亚洲日本VA午夜在线影院| 免费看国产一级特黄aa大片| 国产精品无码永久免费888| 亚洲a级片在线观看| 久久不见久久见免费影院| 一级做a爰片久久毛片免费陪| 亚洲日韩乱码中文无码蜜桃臀网站| 亚洲电影免费在线观看| 中文无码亚洲精品字幕| 亚洲人成国产精品无码| 国产三级在线免费| 一本色道久久88亚洲精品综合| 亚洲国产一成久久精品国产成人综合 | 日韩毛片在线免费观看| 亚洲AV永久无码区成人网站| 成年男女免费视频网站| 国内精品99亚洲免费高清| 亚洲中文久久精品无码1| 久久久久亚洲精品无码网址 |