Spring是一個強有力的java程序框架其被廣泛應用於java的程序中它用POJO提供了企業級服務Spring利用依賴注入可以獲得簡單而有效的測試能力Spring beans依賴關系以及服務所需要的bean都將在配置文件中予以描述配置文件一般采用XML格式然而XML配置文件冗長而不易使用在你進行一個使用了大量bean的大項目中它將變得難以閱讀和控制
在這篇文章中我將給你展示種的有關Spring XML配置文件的最佳技巧它們中的一些具有更多的實際意義而不僅是最好的技巧請注意另外一些因素例如域模型的設計會影響到XML配置但是這篇文章更關注於XML配置的可讀性和可操控性
. 避免使用自動裝配
Spring可以通過bean類的自省來實現自動裝配依賴這樣的話你就不必明確地描述bean的屬性或者構造函數的參數根據屬性名稱活匹配類型bean屬性可以自動進行裝配而構造函數可以根據匹配類型自動裝配你甚至可以設置自動裝配進行自動偵測這樣Spring替你就會選擇一個合適的機制請看下面的例子
Spring可以通過bean類的自省來實現自動裝配依賴這樣的話你就不必明確地描述bean的屬性或者構造函數的參數根據屬性名稱活匹配類型bean屬性可以自動進行裝配而構造函數可以根據匹配類型自動裝配你甚至可以設置自動裝配進行自動偵測這樣Spring替你就會選擇一個合適的機制請看下面的例子
<bean id=orderService
class=comlizjasonspringOrderService
autowire=byName/>
OrderService類的屬性名被用來和容器中的一個bean實例進行匹配自動裝配會默默的保存一些類型信息並降低混亂然而由於它會犧牲掉這種配置的直觀性和可維護性你在實際的項目中將不會用到它許多指南和陳述材料都把它吹捧為Spring的一個非常cool的特性而沒有提到它的這個缺點依我之見就像Spring的對象池一樣它更多了一些商業味道它看起來好像可以使XML配置文件更精簡一些但實際上卻增加其復雜性尤其是在你的較大規模的工程中已經定義了很多bean的時候更是如此Spring允許你混合使用自動和手動裝配但是這種矛盾會使XML配置更加的令人費解
. 使用命名規范
和Java編碼的理念一樣在項目中始終用清晰的描述性的一致的命名規范對開發人員理解XML配置非常有用拿bean ID舉例來說你可以遵循Java類中屬性的命名規范比如說OrderServiceDAO的bean ID應該是orderServiceDAO對於大項目來說在bean ID前加包名來作為前綴
. 使用簡化格式
簡化格式有利於減少冗余因為它把屬性值和引用作為屬性而不是子元素看下面的例子
<bean id=orderService
class=comlizjasonspringOrderService>
<property name=companyName>
<value>lizjason</value>
</property>
<constructorarg>
<ref bean=orderDAO>
</constructorarg>
</bean>
以上程序可以重新以簡化格式書寫為
<bean id=orderService
class=comlizjasonspringOrderService>
<property name=companyName
value=lizjason/>
<constructorarg ref=orderDAO/>
</bean>
簡化格式在版本時已經可用了但請注意不存在<ref local=>這種簡化格式不僅可以較少你的代碼輸入量而且可以使XML配置更加的清晰當你的配置文件中存在大量的bean定義時它可以顯著地提高可讀性
. 盡量使用type而不是index去解決構造函數參數的匹配問題
當構造函數中有多個同類型的參數時Spring只允許你使用從開始的index或者value標簽來解決這個問題請看下面的例子
<bean id=billingService
class=comlizjasonspringBillingService>
<constructorarg index= value=lizjason/>
<constructorarg index= value=/>
</bean>
最好用type屬性取代上面的做法
<bean id=billingService
class=comlizjasonspringBillingService>
<constructorarg type=javalangString
value=lizjason/>
<constructorarg type=int value=/>
</bean>
用index可以稍微減少冗余但是它更容易出錯且不如type屬性可讀性高你應該僅在構造函數中有參數沖突時使用index
. 如可能盡量復用bean定義
Spring提供了一種類似於繼承的機制來降低配置信息的重復並使XML配置更加的簡單一個子bean可以從它的父bean繼承配置信息本質上這個父bean就像它的子bean的一個模板這是一個在大型項目中必須使用的特性所有你要做的就是把父bean的abstract屬性置為true並在子bean中加以引用例如
<bean id=abstractService abstract=true
class=comlizjasonspringAbstractService>
<property name=companyName
value=lizjason/>
</bean>
<bean id=shippingService
parent=abstractService
class=comlizjasonspringShippingService>
<property name=shippedBy value=lizjason/>
</bean>
shippingService bean繼承了abstractService bean的屬性companyName的值lizjason注意如果你為bean聲名一個class或工廠方法這個bean將會默認為abstract
. 盡量使用ApplicationContext裝配bean而不是用import
像Ant腳本中imports一樣Spring的import 元素對於模塊化bean的裝配非常有用例如
<beans>
<import resource=billingServicesxml/>
<import resource=shippingServicesxml/>
<bean id=orderService
class=comlizjasonspringOrderService/>
<beans>
然而比起在XML中用imports預裝配這些bean利用ApplicationContext來配置它們將更加靈活也可以使XML配置更加的易於管理你可以像下面這樣傳遞一個bean定義數組到ApplicationContext的構造函數中
String[] serviceResources =
{orderServicesxml
billingServicesxml
shippingServicesxml};
ApplicationContext orderServiceContext = new
ClassPathXmlApplicationContext(serviceResources);
. 用id來標識bean
你可以用id或名字作為bean的標識用id可讀性較差但是它可以影響XML分析器使bean的reference有效如果id由於XML IDREF約束而無法使用你可以用name作為bean的標識XML IDREF約束是指id必須以字母開始(或者是在XML聲名了的一個標點符號)後面可以是字母數字連字符下劃線冒號或full stops(不知道怎麼翻譯好)在實際應用中很少會遇到XML IDREF約束問題
. 在開發階段使用依賴檢查
你可以為bean的dependencycheck屬性設置一個值來取代默認的none比如說simpleobjects或者all這樣的話容器將替你做依賴有效性的檢查當一個bean的所有屬性(或者某些屬性目錄)都被明確設置或利用自動裝配時將會非常有用
<bean id=orderService
class=comlizjasonspringOrderService
dependencycheck=objects>
<property name=companyName
value=lizjason/>
<constructorarg ref=orderDAO/>
</bean>
在這個例子中容器將確保這些屬性不是privitives或者保證collections是為orderService bean設置的為所有的bean設置默認的依賴檢查是可能的但這個特性由於有些bean的屬性不需要設置而很少使用
. 為每個配置文件加一個描述注釋
在XML配置文件中最好使用有描述性的id和name而不是成堆的注釋另外加一個文件描述頭將會非常有用這個描述可以概括文件中定義的bean另一個選擇你可以在description元素中加入描述信息例如
<beans>
<description>
This file defines billing service
related beans and it depends on
baseServicesxmlwhich provides
service bean templates
</description>
</beans>
用description元素的一個好處就是工具可以很容易的把描述信息從這個元素中提取出來
. 和team members溝通變更
當你修改java源碼後要確保更改了配置文件中的相應部分並把這個情況告知你的team membersXML配置文件也是代碼它們是程序的重要組成部分但它們很難閱讀和維護大多數時間裡你需要同時看XML配置文件和java代碼才能知道是怎麼回事
. setter注入和構造函數注入優先使用前者
Spring提供了三種注入方式構造函數注入setter注入和方法注入一般我們使用前兩種
<bean id=orderService
class=comlizjasonspringOrderService>
<constructorarg ref=orderDAO/>
</bean>
<bean id=billingService
class=comlizjasonspringBillingService>
<property name=billingDAO
ref=billingDAO>
</bean>
在這個例子中orderService bean用了構造函數注入而BillingService bean用了setter注入構造函數注入可以確保bean正確地構建但是setter注入更加的靈活和易於控制特別是當class有多個屬性並且它們中的一些是可選的情況是更是如此
. 不要濫用注入
就像前面提到的Spring的ApplicationContext可以替你創建java對象但不是所有的java對象都應該通過注入創建例如域對象就不應該通過ApplicationContext創建Spring是一個優秀的框架但是考慮到可讀性和可操控性基於XML配置的配置會在定義很多bean的時候出現麻煩過渡使用依賴注入將會使XML配置更加的復雜和冗長切記當使用高效的IDE時例如Eclipse and IntelliJjava代碼更加的易於閱讀維護和管理比使XML文件
結論
XML是Spring流行的配置格式存在大量bean定義時基於XML的配置會變得冗長而不易使用Spring提供了豐富的配置選項適當地使用這些選項可以使XML配置更加的清晰但其它的一些選項例如自動裝配可能會降低可讀性和可維護性參考本文中提到的這些技巧可能會幫助你創建干淨而易讀的XML配置文件
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28571.html