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

IOC 和DI,這兩個在Java中指的是控制反轉和依賴注入;熟悉struts2 , spring的人對於這兩個名詞都很不陌生; spring

最近在學習的過程當中,又不斷的碰到這兩個詞;而網絡上,更多的是對依賴注入的方式進行了說明;而不多提到具體什麼是IOC和DI;在此蠻說一下本身對這兩個的理解; 設計模式

依賴注入、控制反轉;提到這兩個概念,必須首先了解什麼是依賴; 服務器

依賴:"依賴描述了兩個模型元素之間的關係,若是被依賴的模型元素髮生變化就會影響到另外一個模型元素。典型的,在類圖上,依賴關係代表客戶類的操做會調用服務器類的操做。"這個是UML工具Rose幫助文檔上面的描述; 網絡

按照我我的的理解,若是A類中有使用到B類的實例,並經過B類的實例,調用了B的方法,或者B的屬性;那麼A就有依賴於B;例如如下的代碼: 框架

Class A { 工具

private B b = new B(); 學習

public void dosome(){ this

b.do(); 設計

} 對象

}

控制反轉,目的是用於減小模塊之間的耦合的一種設計模式;不少的框架(spring, struts2)都有這個原則/模式;Martin Fowler大師提出了"哪些方面的控制被反轉了"的問題,而且他總結出來是:依賴對象的得到被反轉了;以上面的代碼爲例:A須要調用B對象的方法,因此在A中申明瞭B類的實例,並初始化(建立了)一個實例;這個就是依賴對象的得到;再接着說,A由於是調用B,因此A主動發起B類的實例化;是主動發起,這個應該就是正向;

因此,控制反轉的概念能夠理解爲:被動的接受依賴對象(與原來的:對象是主動去建立(獲取)依賴對象 這種方式造成一種反轉);

然後引出一個被動接受依賴對象的方式:依賴注入;依賴注入也是更好的理解控制反轉的概念,例如如下的代碼:

Class A {

private B b ;

public void dosome(){

b.do();

}

public void setB(B b){

this.b = b;

}

}

Class B{

public void do(){

System.out.println("b ,do ;");

}

}

Class Container{

public Container(){

B b = new B();

A a = new A();

a.setB(b);//// 注入,A類的對象中,使用的B實例是有Container對象注入的,A沒有選擇權,是被動的;

}

}

A類使用的B類的實例,是經過container這個類在初始化A對象的時候,注入(設置)到A對象的;對於A對象來講,它是被動接受的,沒有選擇權,也沒法主動獲取。這個就是控制反轉了。。而上面代碼使用的方式就是依賴注入的一種(基於setter方法);

關於依賴注入的演進能夠參考這篇連載 http://haolloyin.blog.51cto.com/1177454/458416

相關文章
相關標籤/搜索