<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完善的接口層使框架的擴展性得到了很好的保證。縱向繼承體系的逐步擴展,分步驟地實現框架的功能,這種實現方案保證了框架功能不會堆積在某些類的身上,造成過重的代碼邏輯負載,框架的復雜度被完美地分解開了。
    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
    主站蜘蛛池模板: 亚洲最大视频网站| 亚洲第一视频网站| 国产精品无码亚洲精品2021| 国产大片免费网站不卡美女| 亚洲黄色在线网站| 国产高清不卡免费在线| 亚洲美女aⅴ久久久91| 免免费国产AAAAA片| 亚洲中文字幕乱码AV波多JI| 成年女性特黄午夜视频免费看 | 永久黄色免费网站| 亚洲精品福利网泷泽萝拉| 最近中文字幕2019高清免费| 久久久无码精品亚洲日韩京东传媒| 67194成手机免费观看| 亚洲va在线va天堂成人| 日本媚薬痉挛在线观看免费| 日韩在线观看视频免费| 人人狠狠综合久久亚洲88| 热re99久久6国产精品免费| 亚洲国产精品白丝在线观看| 最新仑乱免费视频| 日韩免费在线中文字幕| 亚洲国产精品乱码一区二区| 美丽的姑娘免费观看在线播放| 77777午夜亚洲| 亚洲一级特黄大片在线观看| 久久精品成人免费观看| 亚洲第一男人天堂| 久久乐国产精品亚洲综合| 91福利视频免费观看| 国产成人人综合亚洲欧美丁香花| 久久久久无码专区亚洲av| 免费无码成人AV在线播放不卡| 亚洲综合偷自成人网第页色| 亚洲日本一区二区一本一道| 2021国内精品久久久久精免费| 亚洲av无码av在线播放| 午夜亚洲AV日韩AV无码大全| 免费无码又爽又刺激高潮的视频 | 污网站在线免费观看|