IoC
IoC: Inversion of Control,控制反轉, 控制權從應用程式轉移到架構(如IoC容器),是架構共有特性
IoC容器:實作了IoC思想的容器就是IoC容器
容器:提供元件運作環境,管理元件聲明周期(不管元件如何建立的以及元件之間關系如何裝配的);
IoC容器不僅僅具有容器的功能,而且還具有一些其他特性—如依賴裝配
1、IoC容器特點
【1】無需主動new對象;而是描述對象應該如何被建立即可
IoC容器幫你建立,即被動執行個體化;
【2】不需要主動裝配對象之間的依賴關系,而是描述需要哪個服務(元件),
IoC容器會幫你裝配(即負責将它們關聯在一起),被動接受裝配;
【3】主動變被動,好萊塢法則:别打電話給我們,我們會打給你;
【4】迪米特法則(最少知識原則):不知道依賴的具體實作,隻知道需要提供某類服務的對象(面向抽象程式設計),松散耦合,一個對象應當對其他對象有盡可能少的了解,不和陌生人(實作)說話
【5】IoC是一種讓服務消費者不直接依賴于服務提供者的元件設計方式,是一種減少類與類之間依賴的設計原則。
2、了解IoC容器問題關鍵:控制的哪些方面被反轉了?
(1)、誰控制誰?為什麼叫反轉? —— IoC容器控制,而以前是應用程式控制,是以叫反轉
(2)、控制什麼? —— 控制應用程式所需要的資源(對象、檔案……)
(3)、為什麼控制? —— 解耦元件之間的關系
(4)、控制的哪些方面被反轉了? —— 程式的控制權發生了反轉:從應用程式轉移到了IoC容器。
DI
DI:依賴注入(Dependency Injection) :用一個單獨的對象(裝配器)來裝配對象之間的依賴關系 。
1、了解DI問題關鍵
(1)誰依賴于誰? ——- 應用程式依賴于IoC容器
(2)為什麼需要依賴? ——- 應用程式依賴于IoC容器裝配類之間的關系
(3)依賴什麼東西? ——- 依賴了IoC容器的裝配功能
(4)誰注入于誰? ——- IoC容器注入應用程式
(5)注入什麼東西? ——- 注入應用程式需要的資源(類之間的關系)
更能描述容器其特點的名字——“依賴注入”(Dependency Injection)
IoC容器應該具有依賴注入功能,是以也可以叫DI容器
2、DI優點
【1】幫你看清元件之間的依賴關系,隻需要觀察依賴注入的機制(setter/構造器),就可以掌握整個依賴(類與類之間的關系)。
【2】元件之間的依賴關系由容器在運作期決定,形象的來說,即由容器動态的将某種依賴關系注入到元件之中。
【3】依賴注入的目标并非為軟體系統帶來更多的功能,而是為了提升元件重用的機率,并為系統搭建一個靈活、可擴充的平台。通過依賴注入機制,我們隻需要通過簡單的配置,而無需任何代碼就可指定目标需要的資源,完成自身的業務邏輯,而不用關心具體的資源來自何處、由誰實作。
使用DI限制:元件和裝配器(IoC容器)之間不會有依賴關系,是以元件無法從裝配器那裡獲得更多服務,隻能獲得配置資訊中所提供的那些。
3、IOC關注服務(或應用程式部件)是如何定義的以及他們應該如何定位他們依賴的其它服務。通常,通過一個容器或定位架構來獲得定義和定位的分離,容器或定位架構負責:
(1)儲存可用服務的集合
(2)提供一種方式将各種部件與它們依賴的服務綁定在一起
(3) 為應用程式代碼提供一種方式來請求已配置的對象(例如,一個所有依賴都滿足的對象), 這種方式可以確定該對象需要的所有相關的服務都可用。
現有的架構實際上使用以下三種基本技術的架構執行服務和部件間的綁定:
(1) 類型1 (基于接口): 可服務的對象需要實作一個專門的接口,該接口提供了一個對象,可以從用這個對象查找依賴(其它服務)。早期的容器Excalibur使用這種模式。
(2) 類型2 (基于setter): 通過JavaBean的屬性(setter方法)為可服務對象指定服務。HiveMind和Spring采用這種方式。
(3) 類型3 (基于構造函數): 通過構造函數的參數為可服務對象指定服務。PicoContainer隻使用這種方式。HiveMind和Spring也使用這種方式。
使用IoC/DI容器開發需要改變的思路
1、應用程式不主動建立對象,但要描述建立它們的方式。
2、在應用程式代碼中不直接進行服務的裝配,但要配置檔案中描述哪一個元件需要哪一項服務。容器負責将這些裝配在一起。
其原理是基于OO設計原則的The Hollywood Principle:Don‘t call us, we’ll call you(别找我,我會來找你的)。也就是說,所有的元件都是被動的(Passive),所有的元件初始化和裝配都由容器負責。元件處在一個容器當中,由容器負責管理。
IoC容器功能:執行個體化、初始化元件、裝配元件依賴關系、負責元件生命周期管理。
本質:
IoC:控制權的轉移,由應用程式轉移到架構;
IoC/DI容器:由應用程式主動執行個體化對象變被動等待對象(被動執行個體化);
DI: 由專門的裝配器裝配元件之間的關系;
IoC/DI容器:由應用程式主動裝配對象的依賴變應用程式被動接受依賴
參考:http://jinnianshilongnian.iteye.com/blog/1471944