咱們知道,Spring對象屬性的注入方式有兩種:設值注入和構造注入。先看代碼:
假設有個類爲People,該對象包含三個屬性,name和school還有age,這些屬性都有各自的setter和getter方法,還有一個包含這三個屬性的構造方法。若是用spring來管理這個對象,那麼有如下兩種方式爲People設置屬性:
1.設值注入:spring
<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.構造注入:
性能
<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也同時支持兩種依賴注入方式:設值注入和構造注入。 這兩種依賴注入的方式,並無絕對的好壞,只是適應的場景有所不一樣。相比之下,設值注入有以下優勢:spa
設值注入須要該Bean包含這些屬性的setter方法code
與傳統的JavaBean的寫法更類似,程序開發人員更容易理解、接收。經過setter方法設定依賴關係顯得更加只管。xml
對於複雜的依賴關係,若是採用構造注入,會致使構造器國語臃腫,難以閱讀。Spring在建立Bean實例時,須要同時實例化器依賴的所有實例,於是致使性能降低。而使用設值注入,則能避免這些問題對象
尤爲是在某些屬性可選的狀況況下,多參數的構造器顯得更加笨重開發
構造注入也不是絕對不如設值注入,在某些特定的場景下,構造注入比設值注入更加優秀。構造注入有如下優點:get
構造注入須要該Bean包含帶有這些屬性的構造器class
構造注入能夠在構造器中決定依賴關係的注入順序,優先依賴的優先注入。例如,組件中其餘依賴關係的注入,經常要依賴於DataSrouce的注入。採用構造注入,能夠在代碼中清晰的決定注入順序。依賴注入
對於依賴關係無需變化的Bean,構造注入更有用處。由於沒有Setter方法,全部的依賴關係所有在構造器內設定。所以,無需擔憂後續的代碼對依賴關係產生破壞。
依賴關係只能在構造器中設定,則只有組件的建立者才能改變組件的依賴關係。對組件的調用者而言,組件內部的依賴關係徹底透明,更符合高內聚的原則。
建議:採用以設值注入爲主,構造注入爲輔的注入策略。對於依賴關係無需變化的注入,儘可能採用構造注入;而其餘的依賴關係的注入,則考慮採用設值注入。