深入理解 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 容器開發需要改變思路
- 應用程序不主動創建對象,但要描述創建它們的方式。
- 在應用程序代碼中不直接進行服務的裝配,但是要描述哪一個組件需要哪一項服務,由容器負責將它們裝配在一起。也就是說:所有的組件都是被動的,組件初始化和專供都由容器負責,應用程序只是在獲取相應組件後實現功能即可。