IoC/DI控制反轉與依賴注入

這篇把控制反轉與依賴注入講的很是清楚編程

http://madfroghe.iteye.com/blog/1166639 框架

IoC——Inversion of Control  控制反轉

DI——Dependency Injection   依賴注入ide


1:如何理解IoC/DI
       要想理解上面兩個概念,就必須搞清楚以下的問題:對象

  • 參與者都有誰?blog

  • 依賴:誰依賴於誰?爲何須要依賴? 資源

  • 注入:誰注入於誰?到底注入什麼?get

  • 控制反轉:誰控制誰?控制什麼?爲什麼叫反轉(有反轉就應該有正轉了)?it

  • 依賴注入和控制反轉是同一律念嗎?io

       下面就來簡要的回答一下上述問題,把這些問題搞明白了,IoC/DI也就明白了。
(1)參與者都有誰:class

       通常有三方參與者,一個是某個對象;一個是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所示:


6fe19539-32ce-3a62-bc20-f8dc1e819f82.gif
                                     圖7  常規A使用C示意圖

當有了IoC/DI的容器後,A類再也不主動去建立C了,如圖8所示:


e29bb428-b9f0-3465-8601-671c3fa68b8c.gif
                                    圖8  A類再也不主動建立C


而是被動等待,等待IoC/DI的容器獲取一個C的實例,而後反向的注入到A類中,如圖9所示:

2a537021-45c9-3fd3-80c5-18b9ace2b27a.gif
                                              圖9  有IoC/DI容器後程序結構示意圖


(9)依賴注入和控制反轉是同一律念嗎?
       根據上面的講述,應該能看出來,依賴注入和控制反轉是對同一件事情的不一樣描述,從某個方面講,就是它們描述的角度不一樣。依賴注入是從應用程序的角度在描 述,能夠把依賴注入描述完整點:應用程序依賴容器建立並注入它所須要的外部資源;而控制反轉是從容器的角度在描述,描述完整點:容器控制應用程序,由容器 反向的嚮應用程序注入應用程序所須要的外部資源。
(10)小結一下:

       其實IoC/DI對編程帶來的最大改變不是從代碼上,而是從思想上,發生了「主從換位」的變化。應用程序本來是老大,要獲取什麼資源都是主動出擊,可是在 IoC/DI思想中,應用程序就變成被動的了,被動的等待IoC/DI容器來建立並注入它所須要的資源了。        這麼小小的一個改變實際上是編程思想的一個大進步,這樣就有效的分離了對象和它所須要的外部資源,使得它們鬆散耦合,有利於功能複用,更重要的是使得程序的整個體系結構變得很是靈活。

相關文章
相關標籤/搜索