控制反轉(Ioc)與依賴注入(DI)

##討論控制反轉與依賴注入的關係:java

###什麼是控制反轉?spring

對象之間耦合度太高,必然形成牽一髮而動全身的結局。編程

爲解決對象間的耦合度太高的問題,軟件專家Michael Mattson提出了IoC理論,用來實現對象間的"解耦"。設計模式

**控制反轉(Inversion of Control) **是一種面向對象編程中的一種設計原則,用來減低計算即代碼之間的耦合度。
其基本思想是:藉助於"第三方"實現具備依賴關係的對象之間的解耦。框架

圖1 圖1函數

圖2 圖2單元測試

爲何叫控制反轉(IoC)這個名字?測試

一、 軟件系統在沒有引入IOC容器以前,如圖1所示,對象A依賴於對象B,那麼對象A在初始化或者運行到某一點的時候,本身必須主動去建立對象B或者使用已經建立的對象B。不管是建立仍是使用對象B,控制權都在本身手上。this

二、軟件系統在引入IOC容器以後,這種情形就徹底改變了,如圖2所示,因爲IOC容器的加入,對象A與對象B之間失去了直接聯繫,因此,當對象A運行到須要對象B的時候,IOC容器會主動建立一個對象B注入到對象A須要的地方。設計

經過先後的對比,咱們不難看出來:對象A得到依賴對象B的過程,由主動行爲變爲了被動行爲,控制權顛倒過來了,這就是「控制反轉」這個名稱的由來。


###什麼是依賴注入?

依賴注入就是將實例變量傳入到一個對象中去(Dependency injection means giving an object its instance variables)。

public class Human {
    ...
    Father father;
    ...
    public Human(Father father) {
        this.father = father;
    }
}

將 father 對象做爲構造函數的一個參數傳入。在調用 Human 的構造方法以前外部就已經初始化好了 Father 對象。像這種非本身主動初始化依賴,而經過外部來傳入依賴的方式,咱們就稱爲依賴注入。

好處:
一、解耦,將依賴之間解耦 。
2.、由於已經解耦,因此方便作單元測試,尤爲是 Mock 測試。


###控制反轉和依賴注入的關係

IoC框架使用依賴注入做爲實現控制反轉的方式,可是控制反轉還有其餘的實現方式,例如說ServiceLocator,因此不能將控制反轉和依賴注入等同。

控制反轉是一種思想
依賴注入是一種設計模式


Spring中的依賴注入

簡單來講,spring 使用xml配置文件,經過<bean>獲取相應的對象(每一個bean對應一個對象的實例,默認是單例模式,即在程序的生命週期中,全部的對象只有一個實例,進行重複使用),並存儲在IoC容器中。

運行時,當須要某個對象,就能夠從IoC容器中獲取。也就是注入依賴。


###總結:

一、控制反轉是一種在軟件工程中解耦合的思想,調用類只依賴接口,而不依賴具體的實現類,減小了耦合。控制權交給了容器,在運行的時候才由容器決定將具體的實現動態的「注入」到調用類的對象中。 二、依賴注入是一種設計模式,能夠做爲控制反轉的一種實現方式。依賴注入就是將實例變量傳入到一個對象中去(Dependency injection means giving an object its instance variables)。 三、經過IoC框架,類A依賴類B的強耦合關係能夠在運行時經過容器創建,也就是說把建立B實例的工做移交給容器,類A只管使用就能夠。

相關文章
相關標籤/搜索