剛看spring,對依賴注入DI產生了迷惘,通過查看一些資料總結了一下,希望對此理解深入的人能再指點迷津
依賴注入:程序運行過程中,如需另一個對象協作(調用它的方法、訪問他的屬性時),無須在代碼中創建被調用者,而是依賴於外部容器的注入
看過一些比較好的回答
1.一個人(Java實例,調用者)需要一把斧子(Java實例,被調用者)
在原始社會裏,幾乎沒有社會分工;需要斧子的人(調用者)只能自己去磨一把斧子(被調用者);對應情形爲:Java程序裏的調用者自己創建被調用者,通常採用new關鍵字調用構造器創建一個被調用者
進入工業社會,工廠出現了,斧子不再由普通人完成,而在工廠裏被生產出來,此時需要斧子的人(調用者)找到工廠,購買斧子,無須關心斧子的製造過程;對應簡單工廠設計模式,調用者只需定位工廠,無須管理被調用者的具體實現
進入“共產主義”社會,需要斧子的人甚至無須定位工廠,“坐等”社會提供即可;調用者無須關心被調用者的實現,無須理會工廠,等待Spring依賴注入
總之依賴注入的意思是你需要的東西不是由你創建的,而是第三方,或者說容器提供給你的。這樣的設計符合正交性,即所謂的鬆耦合。
2.依賴注入是調用者僅通過聲明某個組件就可以獲得組件的控制權,而對該組件的依賴關係管理、查找、加載由外部完成。
3.依賴注入就是你不用關心對象的生命週期,什麼時候被創建,什麼時候銷燬,只需直接使用即可,對象的生命週期由提供依賴注入的框架來管理。
一個簡單的例子如下:
public class example1 implement example1Impl{
private example2 exam2;
public example1(){
exam2=new exam2();
}
public void xxx(){
exam2.xxx();
}
}
採用注入的方式(構造器注入):
public class example1 implement example1Impl{
private example2 exam2;
public example1(exam2){
this.exam2=exam2;
}
public void xxx(){
exam2.xxx();
}
}
如何理解第二個比第一個降低了example1和example2類之間的耦合度呢?
Spring可以通過註解和xml配置文件來體現依賴注入,example1不需要自行創建example2的對象,容器通過配置文件設置bean的property屬性,這樣代碼中的依賴關係轉移到了配置文件中了。