Spring XML配置十二個最佳實務

來源:互聯網
上載者:User
xml     在這篇文章裡,對於Spring XML的配置,我將向你展示12種比較好的實踐。其中的一些實踐不僅是好的實踐,更是必要的實踐。除此以外,還有其他因素,例如領域模型的設計,都能影響XML的配置,但是這篇文章重點研究XML配置的易讀性和易管理性。

  1。不要使用autowiring

  Spring可以通過類的自省來自動綁定其依賴部分,使得你不必明確指明bean的屬性和構造器。Bean的屬性可以通過屬性名稱或類型匹配來實現自動綁定。構造器通過類型匹配來實現自動綁定。你甚至可以指定自動檢測自動繫結模式,它可以引導Spring選擇一種適當的運行機制。先來看看下面的一個例子:

    <bean id="orderService"
        class="com.lizjason.spring.OrderService"
        autowire="byName"/>

  OrderService類的屬性名稱在容器中用於匹配bean執行個體。自動綁定可以潛在地節省一些打字和減少一些混亂。但是在現實世界的工程裡你不應該使用這種方式,這是因為它犧牲了配置的清晰性和可維護性。許多指南和介紹中大量吹捧自動綁定是Spring的一種極好的特徵而沒有提到這一特性所帶來的犧牲。依我的觀點,這就像Spring中的object-pooling,它更像是一種為了佔據更多市場的商業特徵。它對於XML設定檔的小巧化是一個好辦法,但實際上也增加了複雜程度,尤其當你運行有大量類聲明的工程時。雖然Spring允許你混合自動綁定和手動綁定,但是這個矛盾會使XML配置更加晦澀難懂。

  2.使用通俗的命名

  這個方式對於Java編碼也一樣適用。在工程中使用清晰的、描述性的、協調的通俗名稱對於開發人員理解XML配置是十分有益的。例如對於bean ID,你可以根據通俗的Java類名來命名它。對於例子中OrderServiceDAO的bean ID命名為orderServiceDAO。對於大的工程,你可以在bean ID前面加上包名作為首碼。

  3. 使用簡潔的形式

  簡潔形式避免了冗長,是因為它從子項目中將屬性值和參考寫到屬性中。例如下面的例子:

    <bean id="orderService"
        class="com.lizjason.spring.OrderService">
        <property name="companyName">
            <value>lizjason</value>
        </property>
        <constructor-arg>
            <ref bean="orderDAO">
        </constructor-arg>
    </bean>

  可以使用簡潔形式將上述代碼重寫為:

    <bean id="orderService"
        class="com.lizjason.spring.OrderService">
        <property name="companyName"
            value="lizjason"/>
        <constructor-arg ref="orderDAO"/>
    </bean>

  簡潔形式功能在1.2版本中可以使用。對於<ref local="...">沒有簡潔形式。簡潔形式不但可以節約你的打字,而且可以使XML設定檔清晰。它最令人信服的是當在一個設定檔中有大量定義的類時可以提高易讀性。

  4. 對於構造器參數匹配,類型名比序號好。

  當一個構造器含有一個以上的同種類型的參數,或者屬性值的標籤已經被佔用時,Spring允許你使用從0計數的序號來解決這些會帶來混淆的問題。例如:

    <bean id="billingService"
        class="com.lizjason.spring.BillingService">
        <constructor-arg index="0" value="lizjason"/>
        <constructor-arg index="1" value="100"/>
    </bean>

  像下面這樣,利用類型屬性來編寫會更好一些:

    <bean id="billingService"
        class="com.lizjason.spring.BillingService">
        <constructor-arg type="java.lang.String"
            value="lizjason"/>
        <constructor-arg type="int" value="100"/>
    </bean>

  使用索引可以稍稍減少一些冗長,但是和使用類型屬性相比,它還是有容易發生錯誤的傾向和難於閱讀的缺點。你應該只在構造器參數不明確的時候,才使用索引這一方法。

  5. 儘可能重用已定義過的bean

  Spring提供一種類似繼承一樣的機制來減少配置資訊的複製並簡化XML配置。定義一個子類可以從它父類那裡繼承配置資訊,而父類實質上作為子類的一個模板。這就是大工程中所謂的重用。你所需要做的就是在父類bean中設定abstract=true,然後在子bean註明它自己的父類bean。例如:

    <bean id="abstractService" abstract="true"        class="com.lizjason.spring.AbstractService">
        <property name="companyName"
            value="lizjason"/>
    </bean>
    <bean id="shippingService"
        parent="abstractService"
        class="com.lizjason.spring.ShippingService">
        <property name="shippedBy" value="lizjason"/>
    </bean>

  ShippingService類從abstractService類那裡繼承companyName屬性的值——lizjason。如果你沒有為一個bean指明類或factory方法,那麼這個bean便是抽象的。

  6. 盡量使用ApplicationContext來裝配定義的bean

  像在Ant指令碼中的引用一樣,Spring的引用對於裝配模組化的bean來說是很有用的。例如:

    <beans>
        <import resource="billingServices.xml"/>
        <import resource="shippingServices.xml"/>
        <bean id="orderService"
            class="com.lizjason.spring.OrderService"/>
    <beans>

  相對於使用import在XML配置中來預裝配,通過ApplicationContext來配置這些beans,顯得更加靈活。利用ApplicationContext也使得XML配置易於管理。你可以像下面的例子那樣在ApplictionContext構造器裡布置bean:

    String[] serviceResources =
        {"orderServices.xml",
        "billingServices.xml",
       "shippingServices.xml"};
    ApplicationContext orderServiceContext = new
        ClassPathXmlApplicationContext(serviceResources);

  7. 利用id作為bean的標識符

  你可以指定一個id或名稱來作為bean的標識符。雖然使用id不會提高易讀性,但是它可以讓XML parser對bean的引用有效方面進行更好的驗證。如果由於XML IDREF的限制而不能使用某個id,你可以利用names來作為bean的標識符。XML IDREF的限制是id必須以字母開頭(或者在XML規範中定義的標點符號),後面接著字母,數字,連字號,底線,冒號等。實際上,遇到XML IDREF限制的問題是很少見的。

  8. 在開發階段使用依賴檢驗

  你可以在bean中給依賴檢驗的屬性設定值,而不採用原先預設的空值,屬性設定例如simple,object或all,以便容器進行依賴檢驗。當bean的全部的屬性(或某類屬性)需要被明確設定或自動綁定時,依賴檢驗便顯得很有用。

    <bean id="orderService"
        class="com.lizjason.spring.OrderService"
        dependency-check="objects">
        <property name="companyName"
            value="lizjason"/>
        <constructor-arg ref="orderDAO"/>
    </bean>

  在這個例子裡,容器確保為orderService bean設定的屬性不是primitives 或者 collections。為所有的bean設定預設依賴檢測也是可以的,但是我們很少這樣做,是因為有些bean的屬性根本就不必設定。

  9. 為每個設定檔加上一個header comment

  最好使用descriptive id和名稱來代替在XML設定檔中的注釋。此外,加上一個設定檔header也很有用處,它可以概述檔案中所定義的bean。你可以選擇將描述內容加入description標籤中。例如:

    <beans>
        <description>
            This file defines billing service
            related beans and it depends on
            baseServices.xml,which provides
            service bean templates...
        </description>
        ...
    </beans>

  使用description標籤的一個好處是可以容易地利用工具從標籤中選取出description(的內容)。

  10. 對於任何變化,要與隊友積極交流

  當你重構Java代碼時,你需要隨時更新設定檔並且通知隊友。XML設定檔也是代碼,它們是應用程式的至關重要的部分,但是它們難於閱讀和維護。大部分時間你既要閱讀XML設定檔又要閱讀運行中的Java代碼。

  11. Setter injection優於constructor injection

  Spring提供3種類型的依賴注入: constructor injection,setter injection, 和method injection。我們一般只用前兩種類型。

    <bean id="orderService"
        class="com.lizjason.spring.OrderService">
        <constructor-arg ref="orderDAO"/>
    </bean>
    <bean id="billingService"
        class="com.lizjason.spring.BillingService">
        <property name="billingDAO"
            ref="billingDAO">
    </bean>

  這個例子中,orderService類使用的是constructor injection,而BillingService類使用的是setter injection。constructor injection可以確保bean不會在一個非法狀態下被建立,但是setter injection更加靈活並且更易管理,尤其當類存在很多屬性並且其中一些是可選的情況下。  

  12. 不要濫用依賴注入

  作為最後一點,Spring ApplicationContext可以替你建立Java對象,但是並不是所有的Java對象都通過依賴注入來建立的。例如,全域的對象不應該通過ApplicationContext來建立。Spring是一個很棒的架構,但是,就易讀性和易管理性而言,當定義大量bean的時候,基於XML的配置問題就會突出。過度的依賴注入會使XML配置變得複雜而且臃腫。記住!使用強大的IDE時,例如Eclipse和IntelliJ,與XML檔案相比,Java代碼更加易讀,易維護,易管理。

  總結

  對於Spring的配置,XML是很優秀的方式。但當定義大量bean時,基於XML配置會變得冗長,笨拙。Spring提供了豐富的配置選項。適當地利用其中的選項可以使XML配置清晰,但是,有些選項,例如autowiring(自動綁定),往往會降低易讀性和易維護性。文章中所列舉的執行個體,可以協助你建立出清晰易讀的XML設定檔。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。