IOC的概念:依賴注入與控制反轉
為什麼需要IOC容器:
如果合作物件的引用或依賴關係的管理由具體物件來完成,會導致程式碼的高度耦合以及可測試性的降低.因此,通過將物件的依賴關係交給IOC容器完成從而降低物件之間的耦合.
Spring中IOC容器的實現
Spring的IOC容器有兩條主線:BeanFactory和ApplicationContext:
- BeanFactory:簡單容器系列,只實現IOC容器的基本功能
- ApplicationContext:容器的高階形態,在BeanFactory的基礎上,增加了許多面向框架的特性,並對應用環境做了適配.
BeanFactory與ApplicationContext介面體系
話不多說,直接上圖:


上圖分別是BeanFactory和ApplicationContext的介面體系,在每個介面(或抽象類,實現類)旁都標註了該類的作用
是不是看不過來?沒關係,我們慢慢分析.
IOC容器的設計主線
BeanFactory作為一個最基本的介面類出現在Spring的IOC容器體系中,為IOC容器的具體實現制定基本的功能規範,體現了Spring為提供給使用者使用的IOC容器所設定的最基本的功能規範。包括Bean的獲取以及一些型別判斷等功能.

- 從BeanFactory的類繼承圖中來看其基本功能的定義,在IOC容器的設計中包括兩條設計主線:
1. BeanFactory設計路徑
從介面BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是一條主要的BeanFactory設計路徑。

在這條設計路徑中,BeanFactory介面定義了基本的IOC容器的規範,包括了getBean()這樣的IOC容器的基本方法。而HierarchicalBeanFactory介面在繼承了BeanFactory的基本介面之後,增加了getParentBeanFactory(),使BeanFactory具備了雙親IOC容器的管理功能。在ConfigurableBeanFactory中主要定義對BeanFactory的配置功能,比如設定雙親容器,配置Bean後置處理器等。通過這些介面設計的疊加,定義了BeanFactory就是簡單IOC容器的基本功能。
這裡涉及的是主要介面關係,而具體的IOC容器都是在這個介面體系下實現的,比如我們熟知的DefaultListableBeanFactory,這個基本IOC容器的實現就是實現了ConfigurableBeanFactory,從而成為一個簡單IOC容器的實現。

2. ApplicationContext為核心的介面設計
第二條設計主線,是以ApplicationContext為核心的介面設計。
BeanFactory--》ListableBeanFactory--》ApplicationContext--》ConfigurableApplicationContext.
在這個介面體系中,ListableBeanFactory和HierarchicalBeanFactory兩個介面連線Beanfactory定義和ApplicationContext定義。

在ListableBeanFactory中,細化了許多BeanFactory的介面功能。而ApplicationContext通過繼承MessageSource、ResourceLoader、ApplicationEventPublisher介面,在BeanFactory簡單容器的基礎上新增了許多對高階容器的特性的支援。