<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Javadream

    A long way and a dream.

      在這篇文章里,對于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配置文件。












































    主站蜘蛛池模板: 内射少妇36P亚洲区| 最近最好最新2019中文字幕免费| 久久国产亚洲精品麻豆| 色www免费视频| 四虎永久在线精品免费影视 | 日韩免费观看的一级毛片| 国产v亚洲v天堂a无| 中国在线观看免费高清完整版| 亚洲欧洲国产经精品香蕉网| 18女人毛片水真多免费| 亚洲国产精品一区二区久| 亚洲色大成WWW亚洲女子| 亚洲一区二区三区免费| 51在线视频免费观看视频| 亚洲视频在线观看免费| 国产亚洲综合视频| 免费人妻av无码专区| selaoban在线视频免费精品| 国产av天堂亚洲国产av天堂| 日韩精品久久久久久免费| 国产一级淫片a免费播放口之 | 亚洲精品不卡视频| www成人免费视频| 国产AV无码专区亚洲AVJULIA| 日本h在线精品免费观看| 亚洲永久在线观看| 免费一级毛片正在播放| 182tv免费视频在线观看| 亚洲fuli在线观看| 久久精品免费一区二区| 成在人线AV无码免费| 男人j进女人p免费视频| 亚洲男人第一av网站| 成人性生活免费视频| 国产免费久久精品99久久| 久久久久亚洲AV无码观看| 日韩视频免费一区二区三区| 中文字字幕在线高清免费电影| 亚洲精品国产肉丝袜久久| 四虎1515hm免费国产| 84pao国产成视频免费播放|