hualinux spring 3.2:什麼是反轉控制IOC和依賴注入DI及關係(新手必看)

目錄

一、什麼是IOC、DI

二、依賴注入的好處

附錄一、 IOC好處

附錄二、spring的依賴注入如何降低了耦合


如果新手開始沒在搞清楚什麼是IOC反轉控制)和DI(依賴)注入,越學到後面越懵,所以前提概念一定要學清楚。

我將在後一章詳細說下,現在是概說 

一、什麼是IOC、DI

根據百度百科IOC概念:

控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。

從上面可以看出,IOC並不是一種技術,而是一種設計思想、設計原則。在Java開發中,Ioc意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。

既然IOC是思想的話,那麼得有實現技術的手段啊,當思想沒落地,那是畫餅!所以上面介紹了DI和DL兩種技術實現手段。

在spring中實現IOC設計思想是通過DI(依賴注入)的技術手段實現的。

所謂依賴注入,就是由IOC容器在運行期間,動態地將某種依賴關係注入到對象之中。

 

二、依賴注入的好處

spring的作用是減低耦合,從編譯器降低,例如不直接通過new方式 而是通過工廠方式獲取對象

依賴註解的好處主要有2個:

1.解偶

2.易於測試

可能直接寫2個不好理解,可以看一下後面的“附錄一”,也可以看一下“依賴注入和單元測試”這篇文章,文章中提到一個概念

當一個類A依賴於另外一個類B的時候,類B的實現直接在類A中設置,我們說A緊耦合於B。

不知道鬆緊偶合,可以看一下百度百科的 松偶合緊偶合

PS:軟件設計中一般是推薦 高內聚低耦合,其中 降低耦合度的方法 提到:

最後當然就是避免直接操作或調用其它模塊或類(內容耦合);如果模塊間必須存在耦合,原則上儘量使用數據耦合,少用控制耦合,限制公共耦合的範圍,避免使用內容耦合。

 

附錄一、 IOC好處

好處就是實現松偶合(解偶)和易於測試。

如果不懂什麼是解耦,看了這個例子你就明白了):

1.從下面的圖可以看出,相互齧合的ABCD四個齒輪組成一個齒輪組,用來完成某項任務。但是,如果有一個齒輪出了問題,就很有可能影響整個齒輪組的正常運轉。

我們可以把齒輪組中的齒輪之間的關係,類比爲軟件系統中對象之間的耦合關係。對象之間的耦合是無法避免的,因爲這是協同合作的基礎。但隨着軟件的規模越來越來,比如一些工業級的軟件,那麼對象之間的依賴關係也會相當複雜,經常會出現對象之間的多重依賴性關係。耦合度過高,結果就會導致牽一髮而動全身的情形。所以,爲了實現對象之間的解耦,提出了IoC理論。

 

2.引入IoC容器,充當“黏合劑”的作用,使得ABCD四個齒輪(對象)沒有了解耦關係,這樣程序員就能夠更好地分工開發各個模塊了

這裏使用計算機和u盤的例子來簡單說明:

  1.方便解耦,簡化開發:計算機和u盤之間沒有相關性,無論哪個出現問題都不會影響另一方。而且,因爲這兩種組件之間的無耦合,所以生成計算機的廠商和生成u盤的廠商可以不同。這樣的話就能夠更好的分工開發了。

  2.易於測試:因爲計算機和u盤之間的無關性,所以非常便於單元測試,分開調試和診斷。這符合spring一直貫徹的好的設計優於具體實現,代碼應易於測試的理念。

摘自《通俗化理解Spring3 IoC的原理和主要組件

 

附錄二、spring的依賴注入如何降低了耦合

依賴注入:程序運行過程中,如需另一個對象協作(調用它的方法、訪問他的屬性時),無須在代碼中創建被調用者,而是依賴於外部容器的注入

看過一些比較好的回答

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屬性,這樣代碼中的依賴關係轉移到了配置文件中了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章