IOC:Inversion of Control(控制反轉)。IOC它所體現的並不是一種技術,而是一種思想,一種將設計好的對象交給容器來管理的思想。IOC的核心思想就體現在控制、反轉這兩個詞上面,要理解就必須要理解幾個問題: 1、誰控制誰?在傳統的開發工作中,我們一般都是主動去new一個對象,這個是...
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理解我就不多闡述了,網上實在是太多了,這裡推薦幾篇博客:
2、【第二章】 IoC 之 2.1 IoC基礎 ——跟我學Spring3
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機制和源碼的學習筆記,其中難免會參考別人的博客,如有雷同,純屬借鑒。同時也避免不了錯誤之處,博文中的錯誤望各位博友指出,不勝感激!!!
參考資料