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