【初探Spring】------Spring IOC(一)

jopen 8年前發布 | 23K 次閱讀 Spring JEE框架 IoC

IOC:Inversion of Control(控制反轉)。IOC它所體現的并不是一種技術,而是一種思想,一種將設計好的對象交給容器來管理的思想。IOC的核心思想就體現在控制、反轉這兩個詞上面,要理解就必須要理解幾個問題:

1、誰控制誰? 在傳統的開發工作中,我們一般都是主動去new一個對象,這個是主動控制依賴對象。但是對于IOC而已,控制權會被移交給容器,所以應該是IOC容器控制對象。

2、控制什么? 既然是IOC容器控制對象,那控制什么呢?IOC容器除了負責控制對象的生成還包括外部資源的獲取。

3、為何是反轉? 對象主動生成依賴對象,我們稱之為“正轉”,但是現在有IOC來負責了,所以反轉則是IOC容器來負責對象的生成和注入過程。

4、那些地方反轉? 依賴對象的獲取被反轉了。

對于IOC而言,它強調是將主動變為被動,由IOC容器來負責依賴對象的創建和查找,由IOC容器來進行注入組合對象。將原來的強聯系、高耦合轉變為了弱關系、松耦合。IOC,它能指導我們如何設計出松耦合、更加優良的程序,把應用程序從原來需要維護依賴對象之間關系中徹底解放出來而更加專注于業務邏輯,這樣會使得程序的整個體系機構變得非常靈活。

其實IoC對編程帶來的最大改變不是從代碼上,而是從思想上,發生了“主從換位”的變化。應用程序原本是老大,要獲取什么資源都是主動出擊,但是在IoC/DI思想中,應用程序就變成被動的了,被動的等待IoC容器來創建并注入它所需要的資源了。

有了IOC就有必要提到DI了。DI,Dependency Injection,即“依賴注入”。其實IOC和DI本就是同一個概念的兩種不同的表述,DI所描述的是由容器動態地將某個依賴關系注入到主鍵當中去,其需要理解如下幾個概念:

1、誰依賴誰? 應用程序依賴IOC容器。

2、依賴什么? 因為應用程序不再主動去創建對象,由IOC容器來向應用程序注入,所以應該是應用程序依賴IOC容器來提供的外部資源。

3、誰注入誰? 由IOC容器向應用程序注入。

4、注入什么? 注入的某個對象所依賴的外部資源。

通俗點將就是 IOC就是容器控制應用程序所需要外部資源的創建和管理,然后將其反轉給應用程序;而DI是應用程序依賴容器提供的外部對象,容器將其依賴的外部資源在運行期注入到應用程序中。兩者表達的意思都是容器負責應用程序的創建和管理,應用程序只需要在需要它們的時候等待容器將其所依賴的外部資源提供就行,至于來自哪里,怎么來的應用程序都不需要知道。

具體的IOC理解我就不多闡述了,網上實在是太多了,這里推薦幾篇博客:

1、 談談對Spring IOC的理解

2、 【第二章】 IoC 之 2.1 IoC基礎 ——跟我學Spring3

3、 Spring的IOC原理[通俗解釋一下]

4、 spring ioc原理(看完后大家可以自己寫一個spring)

IOC結構體系

IOC作為一個容器,它里面放得都是bean、bean與bean之間的對應關系,而bean之間的對應關系我們開始都是通過xml配置文件來體現的。那么這里就反饋了如下幾個問題:

1、對應與對象之間的關系是通過xml配置文件來描述的(當然也可以是properties等文件)。

2、描述的文件存放位置在那里,一般來說我們都是放在classpath目錄下的,但是也可是是URL、fileSystem。

3、文件的解析。

4、Bean在容器中的表現形式,也就是它的數據結構。

對于Spring而言,它用Resource、BeanDefinition、BeanDefinitionReader、BeanFactory、ApplicationContext五個組件來實現以上問題,而同時這5個接口定義了 spring ioc 容器的基本代碼組件結構。下面我們逐一了解這五個結構

Resource

Resource,對資源的抽象,它的每一個實現類都代表了一種資源的訪問策略,如ClasspathResource 、 URLResource ,FileSystemResource 等。

BeanDefinition

用來描述和抽象一個具體的Bean對象,它是描述Bean對象的基本數據結構。

BeanDefinitionReader

外部資源所表達的語義需要統一轉化為統一的內部數據結構BeanDefinition,這個時候BeanDefinitionReader就起到統一解析的作用力了。對應不同的描述需要有不同的 Reader 。如 XmlBeanDefinitionReader 用來讀取xml 描述配置的 bean 對象。

BeanFactory

BeanFactory是一個非常純粹的bean容器,它是IOC必備的數據結構,其中BeanDefinition是她的基本結構,它內部維護著一個BeanDefinition map,并可根據BeanDefinition 的描述進行 bean 的創建和管理。

ApplicationContext

這個就是大名鼎鼎的Spring容器,它叫做應用上下文,與我們應用息息相關,她繼承BeanFactory,所以它是BeanFactory的擴展升級版,如果BeanFactory是屌絲的話,那么ApplicationContext則是名副其實的高富帥。由于ApplicationContext的結構就決定了它與BeanFactory的不同,其主要區別有:

1、繼承MessageSource,提供國際化的標準訪問策略。

2、繼承ApplicationEventPublisher,提供強大的事件機制。

3、擴展ResourceLoader,可以用來加載多個Resource,可以靈活訪問不同的資源。

4、對Web應用的支持。

下圖是上面組合關系圖(以ClasspathXmlApplicationContext 為例)

以上圖片均來自: 啃啃老菜: Spring IOC核心源碼學習(一)

下面LZ將盡全力闡述IOC的初始化過程和在該過程中涉及的重要組件,這系列博客是也是LZ學習、研究Spring機制和源碼的學習筆記,其中難免會參考別人的博客,如有雷同,純屬借鑒。 同時也避免不了錯誤之處,博文中的錯誤望各位博友指出,不勝感激!!!

參考資料

1、啃啃老菜: Spring IOC核心源碼學習(一)

來自: http://www.cnblogs.com/chenssy/p/5106486.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!