Spring的核心機制:依賴注入及設值注入和構造注入的區別
Ø 理解依賴注入
在分析原理之前我們先回顧下依賴注入的概念:
我們常提起的依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java例項,呼叫者)需要另一個角色(另一個Java例項,被呼叫者)的協助時,在 傳統的程式設計過程中,通常由呼叫者來建立被呼叫者的例項。但在Spring裡,建立被呼叫者的工作不再由呼叫者來完成,因此稱為控制反轉;建立被呼叫者 例項的工作通常由Spring容器來完成,然後注入呼叫者,因此也稱為依賴注入。
其實簡單的說,依賴注入起到的作用就是講物件之間的依賴關係從原先的程式碼中解耦出來,通過配置檔案或註解等方式加上
Ø 設值注入
不需要顯示地呼叫set方法,會根據xml的相關配置自動進行呼叫,利用屬性或成員變數的set方法進行注入。
eg:
<span style="white-space:pre;"> </span><bean id="beanA" class="com.daley.serviceImple">
<property name="B" ref="beanB"/>
</bean>
<bean id="beanB" class="com.daley.service"/>
其中property裡面的name是需要注入引數的成員變數的名稱,ref是注入引數引入bean的名稱
如上例:beanA中有一個成員變數名為B,引數型別為beanB,spring的IoC容器會自動的呼叫beanA中的set方法賦值。
Ø 構造注入
在spring的IoC容器呼叫介面的構造方法去建立例項的時候,構造器會自動給成員變數賦值,構造方法中的引數名和成員變數名必須保持一致
<span> </span><bean id="beanA" class="com.daley.serviceImple">
<constructor-arg name="B" ref="beanB"/>
</bean>
<bean id="beanB" class="com.daley.service"/>
Ø 兩種注入方式的對比
相比而言設定注入具有以下優點:
1)與傳統的JavaBean的寫法更相似,程式開發人員更容易理解、接受。
通過setter方法設定依賴關係顯得更加直觀、自然。
2)對於複雜的依賴關係,如果採用構造注入,會導致構造器過於臃腫,難以閱讀。
Spring在建立Bean例項時,需要同時例項化其依賴的全部例項,因而導致效能下降。
而是用設定注入可以避免這些問題。
3)尤其在某些屬性可選的情況下,多引數的構造器更加笨重。
某些情況下,構造注入的優勢:
1)構造注入可以再構造器中決定依賴關係的注入順序,有限依賴的優先注入。
例如,元件中其它依賴關係的注入,常常需要依賴於Datasource的注入。
採用構造注入,可以在程式碼中清晰地決定注入順序。
2)對於依賴關係無需變化的Bean,構造注入更加有用。
因為沒有setter方法,所有的依賴關係全部在構造器內設定。
因此,無需擔心後續程式碼對依賴關係的破壞。
3)依賴關係只能在構造器中設定,則只有組建的建立者才能改變組建的依賴關係。
隊組建的呼叫者而言,元件內部的依賴關係完全透明,更符合高內聚的原則。
建議:採用設定注入為主,構造注入為輔的注入策略。對於依賴關係無需變化的注入,儘量採用構造注入;
而其它的依賴關係的注入,則考慮設值注入。