依賴注入和控制翻轉
IoC——Inversion of Control 控制反轉
DI——Dependency Injection 依賴注入
1:如何理解IoC/DI
要想理解上面兩個概念,就必須搞清楚如下的問題:
- 參與者都有誰?
- 依賴:誰依賴於誰?為什麼需要依賴?
- 注入:誰注入於誰?到底注入什麼?
- 控制反轉:誰控制誰?控制什麼?為何叫反轉(有反轉就應該有正轉了)?
- 依賴注入和控制反轉是同一概念嗎?
下面就來簡要的回答一下上述問題,把這些問題搞明白了,IoC/DI也就明白了。
(1)參與者都有誰:
一般有三方參與者,一個是某個物件;一個是IoC/DI的容器;另一個是某個物件的外部資源。
又要名詞解釋一下,某個物件指的就是任意的、普通的Java物件; IoC/DI的容器簡單點說就是指用來實現IoC/DI功能的一個框架程式;物件的外部資源指的就是物件需要的,但是是從物件外部獲取的,都統稱資源,比如:物件需要的其它物件、或者是物件需要的檔案資源等等。
(2)誰依賴於誰:
當然是某個物件依賴於IoC/DI的容器
(3)為什麼需要依賴:
物件需要IoC/DI的容器來提供物件需要的外部資源
(4)誰注入於誰:
很明顯是IoC/DI的容器 注入 某個物件
(5)到底注入什麼:
就是注入某個物件所需要的外部資源
(6)誰控制誰:
當然是IoC/DI的容器來控制物件了
(7)控制什麼:
主要是控制物件例項的建立
(8)為何叫反轉:
反轉是相對於正向而言的,那麼什麼算是正向的呢?考慮一下常規情況下的應用程式,如果要在A裡面使用C,你會怎麼做呢?當然是直接去建立C的物件,也就是說,是在A類中主動去獲取所需要的外部資源C,這種情況被稱為正向的。那麼什麼是反向呢?就是A類不再主動去獲取C,而是被動等待,等待IoC/DI的容器獲取一個C的例項,然後反向的注入到A類中。
用圖例來說明一下,先看沒有IoC/DI的時候,常規的A類使用C類的示意圖,如圖7所示:
圖7 常規A使用C示意圖
當有了IoC/DI的容器後,A類不再主動去建立C了,如圖8所示:
圖8 A類不再主動建立C
而是被動等待,等待IoC/DI的容器獲取一個C的例項,然後反向的注入到A類中,如圖9所示:
圖9 有IoC/DI容器後程序結構示意圖
(9)依賴注入和控制反轉是同一概念嗎?
根據上面的講述,應該能看出來,依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。依賴注入是從應用程式的角度在描述,可以把依賴注入描述完整點:應用程式依賴容器建立並注入它所需要的外部資源;而控制反轉是從容器的角度在描述,描述完整點:容器控制應用程式,由容器反向的嚮應用程式注入應用程式所需要的外部資源。
(10)小結一下:
其實IoC/DI對程式設計帶來的最大改變不是從程式碼上,而是從思想上,發生了“主從換位”的變化。應用程式原本是老大,要獲取什麼資源都是主動出擊,但是在IoC/DI思想中,應用程式就變成被動的了,被動的等待IoC/DI容器來建立並注入它所需要的資源了。
這麼小小的一個改變其實是程式設計思想的一個大進步,這樣就有效的分離了物件和它所需要的外部資源,使得它們鬆散耦合,有利於功能複用,更重要的是使得程式的整個體系結構變得非常靈活。
原文地址:http://www.iteye.com/topic/692793