天天看點

Spring兩種依賴注入方式的比較

       我們知道,spring對象屬性的注入方式有兩種:設值注入和構造注入。先看代碼:

假設有個類為people,該對象包含三個屬性,name和school還有age,這些屬性都有各自的setter和getter方法,還有一個包含這三個屬性的構造方法。如果用spring來管理這個對象,那麼有以下兩種方式為people設定屬性:

1.設值注入:

<a href="http://my.oschina.net/itblog/blog/203746#">?</a>

1

2

3

4

5

6

<code>&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"people"</code> <code>class</code><code>=</code><code>"com.abc.people"</code><code>&gt;</code>

<code>   &lt;</code><code>property</code> <code>name</code><code>=</code><code>"name"</code> <code>value</code><code>=</code><code>"張三"</code> <code>/&gt; </code><code>&lt;!-- 設值注入 --&gt;</code>

<code>   &lt;</code><code>property</code> <code>name</code><code>=</code><code>"school"</code> <code>ref</code><code>=</code><code>"school"</code> <code>/&gt; </code><code>&lt;!-- 設值注入 --&gt;</code>

<code>   &lt;</code><code>property</code> <code>name</code><code>=</code><code>"age"</code> <code>value</code><code>=</code><code>"20"</code> <code>type</code><code>=</code><code>"int"</code> <code>/&gt;</code>

<code>&lt;/</code><code>bean</code><code>&gt;</code>

<code>&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"school"</code> <code>class</code><code>=</code><code>"com.abc.school"</code> <code>/&gt;</code>

  2.構造注入: 

7

<code>    </code><code>&lt;!-- 構造注入,index=0表示構造器的第一個參數 --&gt;</code>

<code>   &lt;</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"0"</code> <code>value</code><code>=</code><code>"張三"</code><code>/&gt; </code>

<code>   &lt;</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"1"</code> <code>ref</code><code>=</code><code>"school"</code> <code>/&gt; </code><code>&lt;!-- 構造注入 --&gt;</code>

<code>   &lt;</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"2"</code> <code>value</code><code>=</code><code>"20"</code> <code>type</code><code>=</code><code>"int"</code> <code>/&gt;</code>

  那麼,這兩種注入方式有和差別呢?下面做簡單比較: 

在過去的開發過程中,這兩種注入方式都是非常常用的。spring也同時支援兩種依賴注入方式:設值注入和構造注入。 這兩種依賴注入的方式,并沒有絕對的好壞,隻是适應的場景有所不同。相比之下,設值注入有如下優點:

設值注入需要該bean包含這些屬性的setter方法

與傳統的javabean的寫法更相似,程式開發人員更容易了解、接收。通過setter方法設定依賴關系顯得更加隻管。

對于複雜的依賴關系,如果采用構造注入,會導緻構造器國語臃腫,難以閱讀。spring在建立bean執行個體時,需要同時執行個體化器依賴的全部執行個體,因而導緻性能下降。而使用設值注入,則能避免這些問題

尤其是在某些屬性可選的情況況下,多參數的構造器顯得更加笨重

  構造注入也不是絕對不如設值注入,在某些特定的場景下,構造注入比設值注入更加優秀。構造注入有以下優勢:

構造注入需要該bean包含帶有這些屬性的構造器

構造注入可以在構造器中決定依賴關系的注入順序,優先依賴的優先注入。例如,元件中其他依賴關系的注入,常常要依賴于datasrouce的注入。采用構造注入,可以在代碼中清晰的決定注入順序。

對于依賴關系無需變化的bean,構造注入更有用處。因為沒有setter方法,所有的依賴關系全部在構造器内設定。是以,無需擔心後續的代碼對依賴關系産生破壞。

依賴關系隻能在構造器中設定,則隻有元件的建立者才能改變元件的依賴關系。對元件的調用者而言,元件内部的依賴關系完全透明,更符合高内聚的原則。

  建議:采用以設值注入為主,構造注入為輔的注入政策。對于依賴關系無需變化的注入,盡量采用構造注入;而其他的依賴關系的注入,則考慮采用設值注入。