深入理解 IoC、DI

本文轉載自部落格://www.cnblogs.com/xinhuaxuan/p/6132372.html

1、控制反轉:誰控制誰?控制什麼?為何叫反轉(對應於正向)?哪些方面反轉了?為何需要反轉?

  • 誰控制誰?

IoC/DI 容器控制應用程式。

  • 控制什麼?

IoC/DI 容器控制對象本身的創建、實例化;IoC/DI 容器控制對象之間的依賴關係。

  • 為何叫反轉(對應於正向)?

因為現在應用程式不能主動去獲取外部資源了,而是被動等待 IoC/DI 容器給它注入它所需要的資源,所以稱之為反轉。

  • 哪些方面反轉了?

創建對象的方式;程式獲取資源的方式。

  • 為何需要反轉?

引入 IoC/DI 容器過後,體系更為鬆散,而且管理更有序;類之間真正實現了鬆散耦合。

2、依賴:什麼是依賴(按名稱理解、按動詞理解)?誰依賴於誰?為什麼需要依賴?依賴什麼東西?

  • 什麼是依賴(按名稱理解、按動詞理解)?

按名稱理解:依賴關係;按動詞理解:依賴的動作。

  • 誰依賴於誰?

應用程式依賴於 IoC/DI 容器。

  • 為什麼需要依賴?

因為發生了反轉,應用程式依賴的資源都是 IoC/DI 容器裡面。

  • 依賴什麼東西?

應用程式依賴於 IoC/DI 容器,依賴 IoC/DI 容器為它注入所需要的資源(如:依賴關係)。

3、注入:誰注入於誰?注入什麼東西?為何要注入?

  • 誰注入於誰?

IoC/DI 容器注入於應用程式。

  • 注入什麼東西?

注入應用程式需要的外部資源(如:依賴關係)。

  • 為何要注入?

因為程式要正常運行需要這些外部資源。

4、依賴注入和控制反轉是同一概念嗎?

  • 不是同一概念,但實際上它們描述的是同一件事情,只不過是從不同角度來說的:控制反轉是從 IoC/DI 容器的角度;依賴注入是從應用程式的角度。
  • 控制反轉的描述:IoC/DI 容器反過來控制應用程式,控制應用程式鎖所需要的外部資源(如:外部資源)。
  • 依賴注入的描述:應用程式依賴 IoC/DI 容器,依賴它注入所需要的外部資源。

5、參與者都有哪些?

  • IoC/DI 容器、應用程式。

6、IoC/DI 是什麼?能做什麼?怎麼做?用在什麼地方?

  • IoC/DI 是什麼?

IoC:就是使用 IoC/DI 容器反過來控制應用程式所需要的外部資源,這樣的一種程式開發思想。
DI:就是應用程式依賴 IoC/DI 容器來注入所需要的外部資源,這樣一種程式的開發思想。

  • 能做什麼?

鬆散耦合對象。

  • 怎麼做?

可以選擇使用 Spring 框架,裡面有大量已經實現了的 IoC/DI 容器。

  • 用在什麼地方?

凡是程式裡面需要使用外部資源的情況,都可以考慮使用 IoC/DI 容器。

7、什麼是外部資源?

  • 對於一個類來講,外部資源就是指在本類內部不能得到或實現的東西,比如:在類裡面需要讀取一個配置文件,那麼這個配置文件就相當於這個類的外部資源。又比如:A 類裡面要調用 B 類,那麼對於 A 類來講 B 類就是其外部資源。

8、什麼是 IoC 容器?

  • 簡單理解就是:實現 IoC 思想,並提供對象創建、對象裝配以及對象生命周期管理的軟體就是 IoC 容器。
  • 對 IoC 的理解:

a、應用程式無需主動 new 對象,而是描述對象應該如何被創建。
b、應用程式不需要主動裝配對象之間的依賴關係,而是描述需要哪個服務,IoC 容器會幫你裝配,你只需被動接受裝配。
c、主動變被動,是一種讓服務消費者不直接依賴於服務提供者的組件設計方式,是一種減少類與類之間依賴的設計原則。

9、使用 IoC/DI 容器開發需要改變思路

  • 應用程式不主動創建對象,但要描述創建它們的方式。
  • 在應用程式程式碼中不直接進行服務的裝配,但是要描述哪一個組件需要哪一項服務,由容器負責將它們裝配在一起。也就是說:所有的組件都是被動的,組件初始化和專供都由容器負責,應用程式只是在獲取相應組件後實現功能即可。