控制反轉(inversion of control,英文縮寫為ioc)是一個重要的面向對象程式設計的法則來削減計算機程式的耦合問題,也是輕量級的spring架構的核心。
控制反轉一般分為兩種類型,依賴注入(dependency injection,簡稱di)和依賴查找。依賴注入應用比較廣泛。
将控制權從具體的對象手中交給平台或者是架構。
beanfactory是基本的功能接口
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
beanfactory隻是對ioc容器中的基本行為作了定義,但是并沒有管理如何加載 baen.xmlbeanfactory和applicationcontext。
spring提供了一個beanfactory的基本實作----xmlbaenfactory.abstractbeanfactory,defaultlistablebeanfactory這些抽象類為其提供模闆服務.
resource接口來抽象bean的資料對xml定義檔案的解釋委托給xmlbeandefinitionreader來完成。
xmlbeanfacotry的使用過程
建立ioc配置檔案的抽象資源
建立一個beanfactory
把xmlbeandefinitionreader配置給beanfactory
xmlbeandefinitionreader完成資源的解釋,完成對ioc容器的加載
xmlbeanfactory的源代碼
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
xmlbeanfactoy和applicationcontext的差別,xmlbeanfactory不具備定義資源的能力,
applicationcontext
繼承messagesource,可以支援不同的資訊源
通路資源,resourceloader和resource,可以從不同的地方來擷取bean的定義資源
支援應用事件,繼承了applicationevnetpublisher接口
applicationcontext允許上下文嵌套 - 通過保持父上下文可以維持一個上下文體系 - 這個體系我們在以後對web容器中的上下文環境的分析中可以清楚地看到。
對于bean的查找可以在這個上下文體系中發生,首先檢查目前上下文,其次是父上下文,逐級向上,這樣為不同的spring應用提供了一個共享的bean定義環境。
這個我們在分析web容器中的上下文環境時也能看到。
applicationcontext提供ioc容器的主要接口,在其體系中有許多抽象子類比如abstractapplicationcontext為具體的beanfactory的實作。
比如filesystemxmlapplicationcontext和 classpathxmlapplicationcontext提供上下文的模闆,使得他們隻需要關心具體的資源定位問題。
當應用程式代碼執行個體化 filesystemxmlapplicationcontext的時候,得到ioc容器的一種具體表現 - applicationcontext,進而應用程式通過applicationcontext來管理對bean的操作。
beanfactory 是一個接口,在實際應用中我們一般使用applicationcontext來使用ioc容器,
它們也是ioc容器展現給應用開發者的使用接口。對應用程式開發者來說,可以認為beanfactory和applicationfactory在不同的使用層面上代表了spring提供的ioc容器服務。
filesystemxmlapplicationcontext履歷ioc容器
refresh的模闆在abstractapplicationcontext:refresh的模闆在abstractapplicationcontext:refresh的模闆在abstractapplicationcontext
這個方法包含了整個beanfactory初始化的過程,對于特定的filesystemxmlbeanfactory,我們看到定位資源位置由refreshbeanfactory()來實作
在abstractxmlapplicationcontext中定義了對資源的讀取過程,預設由xmlbeandefinitionreader來讀取:
轉到beandefinitionreader中進行處理
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
而在作為其抽象父類的abstractbeandefinitionreader中來定義載入過程
當我們通過resourceloader來載入資源,别忘了了我們的genericapplicationcontext也實作了resourceloader接口
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
而我們的filesystemxmlapplicationcontext就是一個defaultresourceloader - genericapplicationcontext()通過defaultresourceloader
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
我們的filesystemxmlapplicationcontext本身就是是defaultresourceloader的實作類,實作了以下的接口
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
這樣代碼就回到了filesystemxmlapplicationcontext中來,他提供了filesystemresource來完成從檔案系統得到配置檔案的資源定義。
這樣就可以從檔案系統路徑上對ioc配置檔案進行加載 - 當然我們可以按照這個邏輯從任何地方加載,在spring中我們看到它提供的各種資源抽象,比如classpathresource, urlresource,filesystemresource等來供我們使用。
上面我們看到的是定位resource的一個過程,而這隻是加載過程的一部分 。
回到abstractbeandefinitionreaderz中的loaddefinitions(resource)來看看得到代表bean檔案的資源定義以後的載入過程,預設的我們使用xmlbeandefinitionreader
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLlR2bjlHcvN2LcNXZnFWbp9CXt92YuM3ZvxmYuNmLu9Wbt92Yvw1LcpDc0RHaiojIsJye.gif)
如果,您認為閱讀這篇部落格讓您有些收獲,不妨點選一下右下角的【推薦】
如果,您希望更容易地發現我的新部落格,不妨點選一下左下角的【關注我】
如果,您對我的部落格内容感興趣,請繼續關注我的後續部落格,我是【orson】
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段 聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
轉載:http://www.cnblogs.com/java-class/p/5422691.html