標籤:style blog http color os 使用 io strong ar
XmlBeanFactory設計的類繼承關係
1.BeanFactory介面提供了使用IoC容器的規範。在這個基礎上,Spring還提供了符合這個IoC容器介面的一系列容器的實現供開發人員使用。
2.我們以XmlBeanFactory的實現為例來說明簡單IoC容器的設計原理。
3.可以看到,作為一個簡單IoC容器系列最底層實現的XmlBeanFactory,與我們在Spring應用中用到的上下文相比,有一個非常明顯的特點:它只提供最基本的IoC容器的功能。
4.理解這一點有助於我們理解ApplicationContext與基本的BeanFactory之間的區別和聯絡。
5.我們可以認為直接的BeanFactory實現是IoC容器的基本形式,而各種ApplicationContext的實現是IoC容器的進階表現形式。
1.讓我們好好看一下中的繼承關係,從中可以清楚地看到類之間的聯絡,他們都是IoC容器系列的組成部門。
2.在設計這個容器系列時,我們可以從繼承體系的發展上看到IoC容器各項功能的實現過程。如果要擴充自己的容器產品,建議讀者最好在繼承體系中檢查一下,看看Spring是不是已經提供了現成的或相近的容器實現供我們參考。
3.下面就從我們比較熟悉的XmlBeanFactory的實現入手進行分析,來看看一個基本的IoC容器是怎樣實現的。
一個基本的IoC容器是怎樣實現的
1.XmlBeanFactory繼承自DefaultListableBeanFactory這個類,後者非常重要,是我們經常要用到的一個IoC容器的實現,比如在設計應用上下文ApplicationContext時就會用到它。
2.我們會看到這個DefaultListableBeanFactory實際上包含了基本IoC容器所具有的重要功能,也是在很多地方都會用到的容器系列中的一個基本產品。
3.在Spring中,實際上把DefaultListableBeanFactory作為一個預設的功能完整的IoC容器來使用的。
4.XmlBeanFactoy在繼承了DefaultListableBeanFactory容器的功能的同時,增加了新的功能,這些功能很容易從XmlBeanFactory的名字猜到。他是一個與XML相關的BeanFactory,也就是說它是一個可以讀取XML檔案方式定義的BeanDefinition的IoC容器。
5.這些實現XML讀取的功能是怎樣實現的呢?
6.對這些XML檔案定義資訊的處理並不是由XmlBeanFactory直接完成的。
7.在XmlBeanFactory中,初始化了一個XmlBeanDefinitionReader對象,有了這個Reader對象,那些以XML方式定義的BeanDefinition就有了處理的地方。
8.我們可以看到,對這些XML形式的資訊的處理實際上是由這個XmlBeanDefinitionReader來完成的。
1.構造XmlBeanFactory這個IoC容器時,需要指定BeanDefinition的資訊來源,而這個資訊來源需要封裝成Spring中的Resource類來給出。
2.Resource是Spring用來封裝I/O操作的類。比如,我們的BeanDefinition資訊是以XML檔案形式存在的,那麼可以使用像“ClassPath-Resourceres = new ClassPathResource("beans.xml");"這樣具體的ClassPathResource來構造需要的Resource,然後將Resource作為構造參數傳遞給XmlBeanFactory建構函式。這樣,IoC容器就可以方便地定位到需要的BeanDefinition資訊來對Bean完成容器的初始化和依賴注入過程。
1 public class XmlBeanFactory extends DefaultListableBeanFactory { 2 private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); 3 4 public XmlBeanFactory(Resource resource) throws BeansException { 5 this(resource, null); 6 } 7 8 public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactroy)throws BeansException { 9 super(parentBeanFactory);10 this.reader.loadBeanDefinitions(resource);11 }12 13 }XmlBeanFactory的實現
3.XmlBeanFactory的功能是建立在DefaultListableBeanFactory這個基本容器的基礎上的,並在這個基本容器的基礎上實現了其他諸如XML讀取的附加功能。對於這些功能的實現原理,看一看XmlBeanFactory的代碼實現就能很容易地理解。
4.如上面代碼清單所示,在XmlBeanFactory構造方法中需要得到Resource對象。對XmlBeanDefinitionReader對象的初始化,以及使用這個對象來完成對loadBeanDefinitions的調用,就是這個調用啟動從Resource中載入BeanDefinitions的過程,LoadBeanDefinitions同時也是IoC容器初始化的重要組成部分。
1.我們看到XmlBeanFactory使用了DefaultListableBeanFactory作為基類,DefaultListableBeanFactory是很重要的一個IoC實現,在其他IoC容器中,比如ApplicationContext,其實現的基本原理和XmlBeanFactory一樣,也是通過持有或者擴充DefaultListableBeanFactory來獲得基本的IoC容器的功能的。
看看編程方式使用IoC容器
1.參考XmlBeanFactory的實現,我們以編程的方式使用DefaultListableBeanFactory。從中我們可以看到IoC容器使用的一些基本過程。
2.儘管我們在應用中使用IoC容器時很少會使用這樣原始的方式,但是瞭解一下這個基本過程,對我們瞭解IoC容器的工作原理是非常有協助的。
3.因為這個編程式使用容器的過程,很清楚揭示了在IoC容器實現中的那些關鍵的類(比如Resource、DefaultListableBeanFatory和BeanDefinitionReader)之間的相互關係,例如它們是如何把IoC容器的功能解耦的,又是如何結合在一起為IoCContainer Service的,等等。
編程式使用IoC容器
這樣我們就可以通過factory對象來使用DefaultListableBeanFactory這個IoC容器了。
在使用IoC容器時,需要如下幾個步驟:
- 建立IoC設定檔的抽象資源,這個抽象資源包含了BeanDefinition的定義資訊。
- 建立一個BeanFactory,這裡使用DefaultListableBeanFactory。
- 建立一個載入BeanDefinition的讀取器,這裡使用XmlBeanDefinitionReader來載入XML檔案形式的BeanDefinition,通過一個回調配置給BeanFactory。
- 從定義好的資源位置讀入配置資訊,具體的解析過程由XmlBeanDefinitionReader來完成。完成整個載入和註冊Bean定義之後,需要的IoC容器就建立起來了。這個時候就可以直接使用IoC容器了。
BeanFactory容器的設計原理