IOC:Inversion of Control(控制反轉)。IOC它所體現的並非一種技術,而是一種思想,一種將設計好的對象交給容器來管理的思想。IOC的核心思想就體如今控制、反轉這兩個詞上面,要理解就必需要理解幾個問題:html
一、誰控制誰?在傳統的開發工做中,咱們通常都是主動去new一個對象,這個是主動控制依賴對象。可是對於IOC而已,控制權會被移交給容器,因此應該是IOC容器控制對象。spring
二、控制什麼?既然是IOC容器控制對象,那控制什麼呢?IOC容器除了負責控制對象的生成還包括外部資源的獲取。編程
三、爲什麼是反轉?對象主動生成依賴對象,咱們稱之爲「正轉」,可是如今有IOC來負責了,因此反轉則是IOC容器來負責對象的生成和注入過程。數據結構
四、那些地方反轉?依賴對象的獲取被反轉了。學習
對於IOC而言,它強調是將主動變爲被動,由IOC容器來負責依賴對象的建立和查找,由IOC容器來進行注入組合對象。將原來的強聯繫、高耦合轉變爲了弱關係、鬆耦合。IOC,它能指導咱們如何設計出鬆耦合、更加優良的程序,把應用程序從原來須要維護依賴對象之間關係中完全解放出來而更加專一於業務邏輯,這樣會使得程序的整個體系機構變得很是靈活。spa
其實IoC對編程帶來的最大改變不是從代碼上,而是從思想上,發生了「主從換位」的變化。應用程序本來是老大,要獲取什麼資源都是主動出擊,可是在IoC/DI思想中,應用程序就變成被動的了,被動的等待IoC容器來建立並注入它所須要的資源了。.net
有了IOC就有必要提到DI了。DI,Dependency Injection,即「依賴注入」。其實IOC和DI本就是同一個概念的兩種不一樣的表述,DI所描述的是由容器動態地將某個依賴關係注入到主鍵當中去,其須要理解以下幾個概念:設計
一、誰依賴誰?應用程序依賴IOC容器。xml
二、依賴什麼?由於應用程序再也不主動去建立對象,由IOC容器來嚮應用程序注入,因此應該是應用程序依賴IOC容器來提供的外部資源。htm
三、誰注入誰?由IOC容器嚮應用程序注入。
四、注入什麼?注入的某個對象所依賴的外部資源。
通俗點將就是IOC就是容器控制應用程序所須要外部資源的建立和管理,而後將其反轉給應用程序;而DI是應用程序依賴容器提供的外部對象,容器將其依賴的外部資源在運行期注入到應用程序中。二者表達的意思都是容器負責應用程序的建立和管理,應用程序只須要在須要它們的時候等待容器將其所依賴的外部資源提供就行,至於來自哪裏,怎麼來的應用程序都不須要知道。
具體的IOC理解我就很少闡述了,網上實在是太多了,這裏推薦幾篇博客:
二、【第二章】 IoC 之 2.1 IoC基礎 ——跟我學Spring3
四、spring ioc原理(看完後你們能夠本身寫一個spring)
IOC做爲一個容器,它裏面放得都是bean、bean與bean之間的對應關係,而bean之間的對應關係咱們開始都是經過xml配置文件來體現的。那麼這裏就反饋了以下幾個問題:
一、對應與對象之間的關係是經過xml配置文件來描述的(固然也能夠是properties等文件)。
二、描述的文件存放位置在那裏,通常來講咱們都是放在classpath目錄下的,可是也但是是URL、fileSystem。
三、文件的解析。
四、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的不一樣,其主要區別有:
一、繼承MessageSource,提供國際化的標準訪問策略。
二、繼承ApplicationEventPublisher,提供強大的事件機制。
三、擴展ResourceLoader,能夠用來加載多個Resource,能夠靈活訪問不一樣的資源。
四、對Web應用的支持。
下圖是上面組合關係圖(以ClasspathXmlApplicationContext 爲例)
以上圖片均來自:啃啃老菜: Spring IOC核心源碼學習(一)
下面LZ將盡全力闡述IOC的初始化過程和在該過程當中涉及的重要組件,這系列博客是也是LZ學習、研究Spring機制和源碼的學習筆記,其中不免會參考別人的博客,若有雷同,純屬借鑑。同時也避免不了錯誤之處,博文中的錯誤望各位博友指出,不勝感激!!!
參考資料