BeanFactory容器的設計原理

來源:互聯網
上載者:User

標籤: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容器時,需要如下幾個步驟:

  1. 建立IoC設定檔的抽象資源,這個抽象資源包含了BeanDefinition的定義資訊。
  2. 建立一個BeanFactory,這裡使用DefaultListableBeanFactory。
  3. 建立一個載入BeanDefinition的讀取器,這裡使用XmlBeanDefinitionReader來載入XML檔案形式的BeanDefinition,通過一個回調配置給BeanFactory。
  4. 從定義好的資源位置讀入配置資訊,具體的解析過程由XmlBeanDefinitionReader來完成。完成整個載入和註冊Bean定義之後,需要的IoC容器就建立起來了。這個時候就可以直接使用IoC容器了。

 

BeanFactory容器的設計原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.