當前位置:編程學習大全網 - 編程語言 - 急求java面試題

急求java面試題

spring 容器 內部工作機制

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這兩個組件。在本章中,我們將對其他的組件進行講解。

出處://xujar/archive/2008/10/31/3193975.aspx

  • 上一篇:寧夏 銀行考試試題
  • 下一篇:跪求用C++編程!
  • copyright 2024編程學習大全網