在Spring IOC的容器設計中,咱們能夠看到兩個主要的容器系列:數據結構
一個是實現BeanFactory接口的簡單容器系列,這系列容器只實現了最基本的功能spa
另外一個是ApplicationContext應用上下文,做爲容器的高級形態出現設計
1.Spring的IOC容器系列對象
如圖展現了Spring IOC容器的狀況:繼承
接口類BeanFactory,它體現了Spring爲提供給用戶使用的IOC容器的最基本的功能的規範.BeanFactory做爲一個最基本的接口出如今Spring IOC的容器體系中.接口
Spring經過定義BeanDefinition來管理Spring的應用中的各類對象以及它們之間的相互依賴關係.對Spring IOC來講,BeanDefinition就是對依賴翻轉模式中管理的對象依賴關係的數據抽象,也是容器實現依賴翻轉功能的核心數據結構.開發
2.Spring IOC容器的設計get
如圖展現了Spring IOC的主要接口設計:it
從BeanFactory 到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是一條主要的BeanFactory的設計路徑.BeanFactory接口定義了IOC容器的基本功能規範.HierarchicalBeanFactory在繼承了BeanFactory 接口後,增長了getParentBeanFactory()方法,這樣就使容器具有了雙親IOC的管理功能.ConfigurableBeanFactory接口中,主要是定義了一些BeanFactory 的配置功能.io
第二條設計主線,是以ApplicationContext爲核心的接口設計.咱們經常使用的應用上下文主要都是WebApplicationContext或者ConfigurableApplicationContext的實現.
這裏涉及的是主要接口關係,而具體的IOC容器都是在這個接口體系下實現的.
2.1 BeanFactory的應用場景
BeanFactory 接口定義了IOC容器的最基本形式,並提供了IOC容器應該遵照的最基本的服務契約.
用戶使用容器的時候,可使用轉義字符"&"來獲取FactoryBean自己.例如myJndiObject是一個FactoryBean,那麼使用&myJndiObject獲取到的是FactoryBean,而不是這個FactoryBean產生出來的對象.
BeanFactory和FactoryBean:一個是Factory,也就是IOC容器的對象工廠;一個只是一個Bean.在Spring中,全部的Bean都是由BeanFactory來進行管理的.
BeanFactory接口設計了getBean方法,這個方法是使用IOC容器API的主要方法,經過這個方法,能夠取得IOC容器中管理的Bean.有了BeanFactory的定義,咱們能夠執行如下操做:
2.2 BeanFactory容器的設計原理
BeanFactory接口提供了使用IOC容器的規範.在這個基礎上,Spring還提供了不少符合這個IOC容器接口的一系列容器供開發人員使用.咱們以XmlBeanFactory的實現爲例來講明IOC容器的設計原理.
做爲一個簡單IOC的最底層實現的XmlBeanFactory,他有一個很是明顯的特徵:他只提供最基本的IOC容器的功能.這一點和ApplicationContext是有區別的.
XmlBeanFactory繼承自DefaultListableBeanFactory.而DefaultListableBeanFactory實際上包含了基本IOC所具備的重要功能.XmlBeanFactory是一個能夠以XML方式定義的BeanDefinition的IOC容器.對這些XML文件定義信息的處理其實並非由XmlBeanFactory直接完成的.在XmlBeanFactory中,初始化了一個final的XmlBeanDefinitionReader,對XML形式的信息處理實際上也是由他完成的.