1. 程式人生 > >Spring兩種依賴注入方式的比較

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

  我們知道,Spring物件屬性的注入方式有兩種:設值注入和構造注入。先看程式碼:
  假設有個類為People,該物件包含三個屬性,name和school還有age,這些屬性都有各自的setter和getter方法,還有一個包含這三個屬性的構造方法。如果用spring來管理這個物件,那麼有以下兩種方式為People設定屬性:
  1.設值注入:

?
1 2 3 4 5 6 <bean id="people" class="com.abc.People">    <property name="name" value="張三" /> <!-- 設值注入 -->
   <property name="school" ref="school" /> <!-- 設值注入 -->    <property name="age" value="20" type="int" /> </bean> <bean id="school" class="com.abc.School" />

  2.構造注入: 

?
1 2 3 4 5 6 7 <bean id="people" class="com.abc.People"> <!-- 構造注入,index=0表示構造器的第一個引數 -->
   <constructor-arg index="0" value="張三"/>     <constructor-arg index="1" ref="school" /> <!-- 構造注入 -->    <constructor-arg index="2" value="20" type="int" /> </bean> <bean id="school" class="com.abc.School" />

  那麼,這兩種注入方式有和區別呢?下面做簡單比較: 
  在過去的開發過程中,這兩種注入方式都是非常常用的。Spring也同時支援兩種依賴注入方式:設值注入和構造注入。 這兩種依賴注入的方式,並沒有絕對的好壞,只是適應的場景有所不同。

相比之下,設值注入有如下優點:

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

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

  • 對於複雜的依賴關係,如果採用構造注入,會導致構造器國語臃腫,難以閱讀。Spring在建立Bean例項時,需要同時例項化器依賴的全部例項,因而導致效能下降。而使用設值注入,則能避免這些問題

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

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

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

  • 構造注入可以在構造器中決定依賴關係的注入順序,優先依賴的優先注入。例如,元件中其他依賴關係的注入,常常要依賴於DataSrouce的注入。採用構造注入,可以在程式碼中清晰的決定注入順序。

  • 對於依賴關係無需變化的Bean,構造注入更有用處。因為沒有Setter方法,所有的依賴關係全部在構造器內設定。因此,無需擔心後續的程式碼對依賴關係產生破壞。

  • 依賴關係只能在構造器中設定,則只有元件的建立者才能改變元件的依賴關係。對元件的呼叫者而言,元件內部的依賴關係完全透明,更符合高內聚的原則。

  建議:採用以設值注入為主,構造注入為輔的注入策略。對於依賴關係無需變化的注入,儘量採用構造注入;而其他的依賴關係的注入,則考慮採用設值注入。