Spring的學習筆記一(Spring Framework的核心:IOC容器的實現)

#Spring IOC的概述
1.1.1 依賴反轉是什麼呢?

如果合作對象的引用或依賴關係的管理有具體對象來完成,會導致代碼的高度耦合和可測試性的降低。我們以前就是這樣乾的,大家可以想象我們創建的類B要調用類A中的a方法我們是如何幹的呢?
因爲很多對象依賴關係的建立和維護不需要和系統運行狀態有很強的關聯性,所以可以把在面向對象編程中需要執行的諸如新建對象、爲對象引用賦值等操作交由容器統一完成。

1.1.2Spring IOC的應用場景

解耦的利器
在spring中SpringIOC提供了一個基本的JavaBean容器,通過IOC模式管理依賴關係並通過依賴注入和AOP切面增強了爲JavaBean這樣的POJO容器對象賦予事務的管理,聲明週期管理等功能;

注入方式

  • 接口注入
  • setter注入
  • 構造器注入

2.1 IOC容器系列的設計與實現:BeanFactory和ApplicationContext

BeanFactory:簡單容器系列,只實現了容器的最基本的功能
ApplicationContext:應用上下文,容器的高級形態而存在;他作爲容器的高級形態而存在,應用上下文在簡單容器的基礎上,增加了許多現象框架的特徵,同時對應用環境做了許多的適配;

2.2.1 Spring的IOC容器系列

  1. 我們通常所說的IOC容器,實際上代表的就是着一系列功能各異的容器產品,只是容器的工能有大有小,各自有各自的特點;

  2. BeanDefinition:管理spring的應用中的各種對象以及它們之間的相互依賴關係

  3. IOC是用來管理對象的依賴關係的,對IOC容器來說,BeanDefinition就是對依賴反轉模式中管理的對象依賴關係的數據抽象們也是容器實現依賴反轉的核心數據結構,依賴反轉功能都是圍繞這個BeanDefinition的處理來實現的。

2.2.2 Spring IOC 容器的設計
IOC容器接口設計圖
接口的兩條設計主線

  1. 從接口BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory
  2. 以ApplicationContext應用上下文接口爲核心的接口設

BeanFactory

  1. BeanFactory的應用場景:

BeanFactory提供的是最基本的IOC容器功能,它只是一個接口類,並沒有給出容器的具體實現,而DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等都可以看做是容器附加了某種功能的具體實現,也就是容器體系中具體的容器產品。

BeanFactory和FactoryBean:

  1. 在spring中所有的bean都是由BeanFactory(IOC 容器)來管理的;
  2. FactoryBean是一個能生產或者修飾對象的工廠bean,它的實現與設計模式中的工廠模式和裝飾者模式有關
  3. BeanFactory接口設計了getBean方法,這個方法是使用IOC容器API的主要方法,可以取得IOC容器中管理的Bean,Bean的取得是通過指定名字來索引的
  • BeanFactory容器的設計原理:XmlBeanFactoy設計的類繼承關係

BeanFactory只提供最基本的IOC容器功能,而XMLBeanFactory是實現IOC容器的高級表現形式

  • 可以看到XMLBeanFactory繼承自DefaultListableBeanFactory這個類;

DefaultListableBeanFactory實際上包含了基本IOC容器所具有的重要功能,在設計應用上下文ApplicationContext的時候就會用到它;
在spring中實際上把DefaultListableBeanFactory作爲一個默認的功能完整的IOC容器來使用的;

  • 從XMLBeanFactory的名字我們能猜到它是一個可以讀取xml文件的BeanFactory,但其實它對xml文件定義信息的處理是通過一個XMLBeanDefinitionReader對象來完成的;
  • 構造XMLBeanFactory這個IOC容器時,需要指定BeanDefinition的信息來源,而這個信息來源需要封裝成spring的Resource類來給出;

在使用IOC容器時,需要注意如下幾個步驟:

  1. 創建IOC配置文件的抽象資源,這個抽象資源包含了BeanDefinition的定義信息;
  2. 創建一個BeanFactory,這裏使用DefaultListableBeanFactory;
  3. 創建一個載入BeanDefinition的讀取器,這裏使用的是XMLBeanDefinitionReader來載入xml文件形式的BeanDefinition,通過一個回調配置給BeanFactory;
  4. 從定義好的資源配置位置讀入配置信息,具體解析的過程有XmlBeanDefinitionReader來完成。完成整個載入和註冊Bean定義之後,需要的IOC容器就建立起來了。

ApplicationContext

  1. ApplicationContext的應用場景

ApplicationContext提供了BeanFactory所不具備的幾個特性

  1. 支持不同的信息源:擴展了messageSource接口,支持國際化
  2. 訪問資源:對ResourceLoader和Resource的支持上。我們可以從不同的地方得到Bean定義資源
  3. 支持應用事件:這些事件和bean的聲明週期的結合爲bean的管理提供了便利
  4. 在ApplicationContext中提供附加的服務
  1. ApplicationContext容器的設計原理

2.3IOC容器的初始化過程

refresh()方法,這個方法標誌IOC容器正式啓動;
具體的來說這個啓動包含了BeanDefinition和Resource的定位、載入、註冊這三個基本過程,在spring中這三個過程的實現是分開的,通過不同的模塊來完成;

  1. Resource定位過程,既BeanDefinition 的資源定位
  2. BeanDefinition的載入,把用戶封裝好的Bean表示成IOC容器的內部的數據結構;這個容器的內部數據結構就是BeanDefinition,而這個BeanDefinition實際就是POJO對象在IOC容器中的抽象;
  3. 向IOC容器註冊這些BeanDefinition的過程,調用BeanDefinitionRegistry接口實現來完成的,在IOC內部將BeanDefinition注入到一個hashmap中去,IOC容器就是通過這個hashmap來持有這些BeanDefinition數據的;

特別注意

  1. 上面說的是IOC容器的初始化過程,在這個過程並不包含bean依賴注入的實現;
  2. 在spring IOC中 bean定義的載入和依賴注入是兩個獨立過程
    ① 依賴注入一般發生在應用第一次通過getBean向容器索取bean的時候,
    ②有一個例外需要特別注意:
    如果對某個屬性設置了lazyinit屬性,如果設置了這個屬性那麼這個Bean的依賴注入在IOC容器初始化得時候就預先完成了,而不需要等到IOC容器初始化完成以後,在第一次調用getBean的時候再去初始化;
  1. BeanDefinition的載入和解析
  2. BeanDefinition在IOC容器中註冊

2.4 IOC容器的依賴注入
2.5 容器的其他相關特性的設計和實現

  1. ApplicationContext和Bean的初始化以及銷燬
  2. lazy-init屬性和預實例化
  3. FactoryBean的實現
  4. BeanPostprocessor的實現
  5. autowiring自動裝配的實現
  6. Bean的依賴檢查
  7. Bean對IOC容器的感知
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章