Spring中的控制反轉Ioc依賴注入DI的區別和聯繫

控制反轉簡稱IOC(inversion of control)

依賴注入簡稱DI(Dependency Injection)  

要理解這兩個概念,首先要搞清楚以下幾個問題:

  • 參與者都有誰?
  • 依賴:誰依賴於誰?爲什麼需要依賴? 
  • 注入:誰注入於誰?到底注入什麼?
  • 控制反轉:誰控制誰?控制什麼?爲何叫反轉(有反轉就應該有正轉了)?
  • 依賴注入和控制反轉是同一概念嗎?

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

   一般有三方參與者,一個是某個對象;一個是IoC/DI的容器;另一個是某個對象的外部資源。又要名詞解釋一下,某個對象指的就是任意的、普通的Java對象; IoC/DI的容器簡單點說就是指用來實現IoC/DI功能的一個框架程序;對象的外部資源指的就是對象需要的,但是是從對象外部獲取的,都統稱資源,比如:對象需要的其它對象、或者是對象需要的文件資源等等。

(2)誰依賴於誰:

   是某個對象依賴於spring的容器

(3)爲什麼需要依賴:

   對象需要spring的容器來提供對象需要的外部資源

(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所示:

     
              圖1  常規A使用C示意圖


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

     
              圖2  A類不再主動創建C


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

(9)依賴注入和控制反轉是同一概念嗎?

    根據上面的講述,應該能看出來,依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。依賴注入是從應用程序的角度在描述,可以把依賴注入描述完整點:應用程序依賴容器創建並注入它所需要的外部資源而控制反轉是從容器的角度在描述,描述完整點:容器控制應用程序,由容器反向的嚮應用程序注入應用程序所需要的外部資源。


(10)總結:

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


發佈了31 篇原創文章 · 獲贊 92 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章