1. 程式人生 > >spring的依賴注入怎麼理解

spring的依賴注入怎麼理解

http://zhidao.baidu.com/question/399874366.html?fr=qrl&index=4&qbl=topic_question_4&word=%D2%C0%C0%B5%D7%A2%C8%EB%B5%C4%BA%C3%B4%A6
先看一段程式碼
假設你編寫了兩個類,一個是人(Person),一個是手機(Mobile)。 
人有時候需要用手機打電話,需要用到手機的dialUp方法。 
傳統的寫法是這樣: 

Java code 

public class Person{
    public boolean makeCall(long number){
        Mobile mobile=new Mobile();
        return mobile.dialUp(number);
    }
}

也就是說,類Person的makeCall方法對Mobile類具有依賴,必須手動生成一個新的例項new   Mobile()才可以進行之後的工作。 
依賴注入
的思想是這樣,當一個類(Person)對另一個類(Mobile)有依賴時,不再該類(Person)內部對依賴的類(Moblile)進行例項化,而是之前配置一個beans.xml,告訴容器所依賴的類(Mobile),在例項化該類(Person)時,容器自動注入一個所依賴的類(Mobile)的例項。 介面: Java code public Interface MobileInterface{ public boolean dialUp(long number); } Person類: Java code public class Person{ private MobileInterface mobileInterface; public boolean makeCall(long number){ return this.mobileInterface.dialUp(number); } public void setMobileInterface(MobileInterface mobileInterface){ this.mobileInterface=mobileInterface; } } 在
xml檔案
中配置依賴關係 Java code <bean id="person" class="Person"> <property name="mobileInterface"> <ref local="mobileInterface"/> </property> </bean> <bean id="mobileInterface" class="Mobile"/> 這樣,Person類在實現撥打電話的時候,並不知道Mobile類的存在,它只知道呼叫一個介面MobileInterface,而MobileInterface的具體實現是通過Mobile類完成,並在使用時由容器自動注入,這樣大大降低了不同類間相互依賴的關係。
http://zhidao.baidu.com/question/37261996.html?fr=qrl&index=0&qbl=topic_question_0&word=%D2%C0%C0%B5%D7%A2%C8%EB%B5%C4%BA%C3%B4%A6
依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java例項,呼叫者)需要另一個角色(另一個Java例項,被呼叫者)的協助時,在傳統的程式設計過程中,通常由呼叫者來建立被呼叫者的例項。但在Spring裡,建立被呼叫者的工作不再由呼叫者來完成,因此稱為控制反轉;建立被呼叫者例項的工作通常由Spring容器來完成,然後注入呼叫者,因此也稱為依賴注入。

  不管是依賴注入,還是控制反轉,都說明Spring採用動態、靈活的方式來管理各種物件。物件與物件之間的具體實現互相透明。在理解依賴注入之前,看如下這個問題在各種社會形態裡如何解決:一個人(Java例項,呼叫者)需要一把斧子(Java例項,被呼叫者)。

  (1)原始社會裡,幾乎沒有社會分工。需要斧子的人(呼叫者)只能自己去磨一把斧子(被呼叫者)。對應的情形為:Java程式裡的呼叫者自己建立被呼叫者。

  (2)進入工業社會,工廠出現。斧子不再由普通人完成,而在工廠裡被生產出來,此時需要斧子的人(呼叫者)找到工廠,購買斧子,無須關心斧子的製造過程。對應Java程式的簡單工廠的設計模式。

  (3)進入“按需分配”社會,需要斧子的人不需要找到工廠,坐在家裡發出一個簡單指令:需要斧子。斧子就自然出現在他面前。對應Spring的依賴注入。

  第一種情況下,Java例項的呼叫者建立被呼叫的Java例項,必然要求被呼叫的Java類出現在呼叫者的程式碼裡。無法實現二者之間的鬆耦合。

  第二種情況下,呼叫者無須關心被呼叫者具體實現過程,只需要找到符合某種標準(介面)的例項,即可使用。此時呼叫的程式碼面向介面程式設計,可以讓呼叫者和被呼叫者解耦,這也是工廠模式大量使用的原因。但呼叫者需要自己定位工廠,呼叫者與特定工廠耦合在一起。

  第三種情況下,呼叫者無須自己定位工廠,程式執行到需要被呼叫者時,系統自動提供被呼叫者例項。事實上,呼叫者和被呼叫者都處於Spring的管理下,二者之間的依賴關係由Spring提供。

  所謂依賴注入,是指程式執行過程中,如果需要呼叫另一個物件協助時,無須在程式碼中建立被呼叫者,而是依賴於外部的注入。Spring的依賴注入對呼叫者和被呼叫者幾乎沒有任何要求,完全支援對POJO之間依賴關係的管理。依賴注入通常有兩種:

  ·設值注入。

  ·構造注入。