1. 程式人生 > >Spring-三種依賴注入方式

Spring-三種依賴注入方式

            三種依賴注入方式,即構造方法注入(constructor injection),setter方法注入(setter injection)以及介面注入(interface injection).

構造方法注入(constructor injection)

          構造方法注入,就是被注入物件可以通過在其構造方法中宣告依賴物件的引數列表,讓外部(通常是IOC容器)知道它需要哪些依賴物件。           IoC Service Provider會檢查被注入物件的構造方法,取得它所需要的依賴物件列表,進而為其注入相應的物件,同一個物件是不可能被構造兩次的,因此,被注入物件的構造乃至整個生命週期,應該是由IOC Service Provider來管理的。 
          構造方法注入方式比較直觀,物件被構造完成後,即進入構造狀態,可以馬上使用。

setter方法注入(setter injection)

          對於JavaBean物件來說,通常會通過setXXX()和getXXX()方法來訪問對應屬性。這些setXXX()方法統稱為settter方法,getXXX()就成為getter方法。通過setter方法,可以更改相應的物件屬性,通過getter方法,可以獲得相應屬性的狀態。所以,當前物件只要為其依賴物件所對應的屬性新增setter方法,就可以通過setter方法將相應的依賴物件設定到被注入物件中。          setter方法注入雖不像構造方法注入那樣,讓物件構造完成後即可使用,但相對來說更寬鬆一些,可以在物件構造完成後再注入。

介面注入(interface injection)

          相對於前兩種注入方式,介面注入沒有那麼簡單明瞭。被注入物件如果想要IOC Service provider為其注入依賴物件,就必須實現某個介面。這個介面提供一個方法。用來為其注入依賴物件。IOC Service Provider最終通過這些介面來了解應該為被注入物件注入什麼依賴物件。           介面注入相對於前兩種注入方式,比較死板和煩瑣,如果需要注入依賴物件,被注入物件就必須宣告和實現另外的介面。

三種注入方式的比較

        介面注入,從注入方式的使用上來說,介面注入是現在不太提倡的一種方式。因為它強制被注入物件實現不必要的介面。帶有侵入性。而構造方法和setter方法注入則不需要如此。
        構造方法注入:這種注入方式的優點就是,物件在構造完成之後,即已進入就緒狀態。可以馬上使用。缺點就是,當依賴物件比較多的時候,構造方法的引數列表會比較長。而通過反射構造物件的時候,對相同型別的引數的處理會比較困難,維護和使用上也比較麻煩。而且在java中,構造方法無法被繼承,無法設定預設值,對於非必需的依賴處理,可能需要引入多個構造方法,而引數數量的變動可能造成維護上的不便。 構造注入可以在構造器中決定依賴關係的注入順序,優先依賴的優先注入。 對於依賴關係不需要變化的Bean,構造注入更有用處。因為沒有setter方法,所有的依賴關係全部在構造器內設定,因此,不需要擔心後續的程式碼對依賴關係產生破壞。 依賴關係只能在構造器中設定,則只有元件的建立者才能改變元件的依賴關係。對元件的呼叫者而言,元件內部的依賴關係完全透明,更符合高內聚的原則。         setter方法注入:因為方法可以命名,所以setter方法注入在描述性上要比構造方法注入好一些。另外,setter方法可以被繼承,允許設定預設值,而且有良好的IDE支援。缺點就是物件無法再構造完成後馬上進入就緒狀態。 與傳統的JavaBean的寫法更相似,程式開發人員更容易理解接受,通過setter方法設定依賴關係顯得更加直觀,自然。 對於複雜的依賴關係,如果採用構造注入,這樣做的話會導致構造器過於臃腫,使得難以閱讀。Spring在建立Bean例項時,需要同時例項化其依賴的全部例項,因而導致效能下降。而使用設值注入,就能夠避免這些問題 。 尤其是在某些屬性可選的情況下,多引數的構造器更加笨重。         綜上,構造方法注入和setter方法注入因為其侵入性較弱,且易於理解和使用,所以是現在使用最多的注入方式,而介面注入因為侵入性較強,近年來已經不流行了。 本部落格參考自王福強的《Spring揭祕》