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

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

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

    博學(xué)而篤志,好問而近思

    有關(guān)Spring 的 XML 配置問題

    ??????? 1.最好別使用autowiring

      Spring可以通過類的自省來自動(dòng)綁定其依賴部分,使得你不必明確指明bean的屬性和構(gòu)造器。Bean的屬性可以通過屬性名稱或類型匹配來實(shí)現(xiàn)自動(dòng)綁定。構(gòu)造器通過類型匹配來實(shí)現(xiàn)自動(dòng)綁定。你甚至可以指定自動(dòng)檢測自動(dòng)綁定模式,它可以引導(dǎo)Spring選擇一種適當(dāng)?shù)倪\(yùn)行機(jī)制。先來看看下面的一個(gè)例子:

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

      OrderService類的屬性名在容器中用于匹配bean實(shí)例。自動(dòng)綁定可以潛在地節(jié)省一些打字和減少一些混亂。但是在現(xiàn)實(shí)世界的工程里你不應(yīng)該使用這種方式,這是因?yàn)樗鼱奚伺渲玫那逦院涂删S護(hù)性。許多指南和介紹中大量吹捧自動(dòng)綁定是Spring的一種極好的特征而沒有提到這一特性所帶來的犧牲。依我的觀點(diǎn),這就像Spring中的object-pooling,它更像是一種為了占據(jù)更多市場的商業(yè)特征。它對于XML配置文件的小巧化是一個(gè)好辦法,但實(shí)際上也增加了復(fù)雜程度,尤其當(dāng)你運(yùn)行有大量類聲明的工程時(shí)。雖然Spring允許你混合自動(dòng)綁定和手動(dòng)綁定,但是這個(gè)矛盾會(huì)使XML配置更加晦澀難懂。

      2.使用通俗的命名

      這個(gè)方式對于Java編碼也一樣適用。在工程中使用清晰的、描述性的、協(xié)調(diào)的通俗名稱對于開發(fā)者理解XML配置是十分有益的。例如對于bean ID,你可以根據(jù)通俗的Java類名來命名它。對于例子中OrderServiceDAO的bean ID命名為orderServiceDAO。對于大的工程,你可以在bean ID前面加上包名作為前綴。

      3. 使用簡潔的形式

      簡潔形式避免了冗長,是因?yàn)樗鼜淖釉刂袑傩灾岛蛥⒖紝懙綄傩灾小@缦旅娴睦樱?/p>

    <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="...">沒有簡潔形式。簡潔形式不但可以節(jié)約你的打字,而且可以使XML配置文件清晰。它最引人注目的是當(dāng)在一個(gè)配置文件中有大量定義的類時(shí)可以提高易讀性。

      4. 對于構(gòu)造器參數(shù)匹配,類型名比序號好。

      當(dāng)一個(gè)構(gòu)造器含有一個(gè)以上的同種類型的參數(shù),或者屬性值的標(biāo)簽已經(jīng)被占用時(shí),Spring允許你使用從0計(jì)數(shù)的序號來解決這些會(huì)帶來混淆的問題。例如:

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

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

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

      使用索引可以稍稍減少一些冗長,但是和使用類型屬性相比,它還是有容易發(fā)生錯(cuò)誤的傾向和難于閱讀的缺點(diǎn)。你應(yīng)該只在構(gòu)造器參數(shù)不明確的時(shí)候,才使用索引這一方法。

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

      Spring提供一種類似繼承一樣的機(jī)制來減少配置信息的復(fù)制并簡化XML配置。定義一個(gè)子類可以從它父類那里繼承配置信息,而父類實(shí)質(zhì)上作為子類的一個(gè)模板。這就是大工程中所謂的重用。你所需要做的就是在父類bean中設(shè)置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。如果你沒有為一個(gè)bean指明類或factory方法,那么這個(gè)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配置中來預(yù)裝配,通過ApplicationContext來配置這些beans,顯得更加靈活。利用ApplicationContext也使得XML配置易于管理。你可以像下面的例子那樣在ApplictionContext構(gòu)造器里布置bean:

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

      7. 利用id作為bean的標(biāo)識符

      你可以指定一個(gè)id或名稱來作為bean的標(biāo)識符。雖然使用id不會(huì)提高易讀性,但是它可以讓XML parser對bean的引用有效方面進(jìn)行更好的驗(yàn)證。如果由于XML IDREF的限制而不能使用某個(gè)id,你可以利用names來作為bean的標(biāo)識符。XML IDREF的限制是id必須以字母開頭(或者在XML規(guī)范中定義的標(biāo)點(diǎn)符號),后面接著字母,數(shù)字,連字號,下劃線,冒號等。實(shí)際上,遇到XML IDREF限制的問題是很少見的。

      8. 在開發(fā)階段使用依賴檢驗(yàn)

      你可以在bean中給依賴檢驗(yàn)的屬性設(shè)置值,而不采用原先默認(rèn)的空值,屬性設(shè)置例如simple,object或all,以便容器進(jìn)行依賴檢驗(yàn)。當(dāng)bean的全部的屬性(或某類屬性)需要被明確設(shè)置或自動(dòng)綁定時(shí),依賴檢驗(yàn)便顯得很有用。

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

      在這個(gè)例子里,容器確保為orderService bean設(shè)置的屬性不是primitives 或者 collections。為所有的bean設(shè)置默認(rèn)依賴檢測也是可以的,但是我們很少這樣做,是因?yàn)橛行゜ean的屬性根本就不必設(shè)置。

      9. 為每個(gè)配置文件加上一個(gè)header comment

      最好使用descriptive id和名稱來代替在XML配置文件中的注釋。此外,加上一個(gè)配置文件header也很有用處,它可以概述文件中所定義的bean。你可以選擇將描述內(nèi)容加入description標(biāo)簽中。例如:

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

      使用description標(biāo)簽的一個(gè)好處是可以容易地利用工具從標(biāo)簽中選取出description(的內(nèi)容)。

      10. 對于任何變化,要與隊(duì)友積極交流

      當(dāng)你重構(gòu)Java代碼時(shí),你需要隨時(shí)更新配置文件并且通知隊(duì)友。XML配置文件也是代碼,它們是應(yīng)用程序的至關(guān)重要的部分,但是它們難于閱讀和維護(hù)。大部分時(shí)間你既要閱讀XML配置文件又要閱讀運(yùn)行中的Java代碼。

      11. Setter injection優(yōu)于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>

      這個(gè)例子中,orderService類使用的是constructor injection,而BillingService類使用的是setter injection。constructor injection可以確保bean不會(huì)在一個(gè)非法狀態(tài)下被創(chuàng)建,但是setter injection更加靈活并且更易管理,尤其當(dāng)類存在很多屬性并且其中一些是可選的情況下。  

      12. 不要濫用依賴注入

      作為最后一點(diǎn),Spring ApplicationContext可以替你創(chuàng)建Java對象,但是并不是所有的Java對象都通過依賴注入來創(chuàng)建的。例如,全局的對象不應(yīng)該通過ApplicationContext來創(chuàng)建。Spring是一個(gè)很棒的框架,但是,就易讀性和易管理性而言,當(dāng)定義大量bean的時(shí)候,基于XML的配置問題就會(huì)突出。過度的依賴注入會(huì)使XML配置變得復(fù)雜而且臃腫。記住!使用強(qiáng)大的IDE時(shí),例如Eclipse和IntelliJ,與XML文件相比,Java代碼更加易讀,易維護(hù),易管理。

      總結(jié)

      對于Spring的配置,XML是很優(yōu)秀的方式。但當(dāng)定義大量bean時(shí),基于XML配置會(huì)變得冗長,笨拙。Spring提供了豐富的配置選項(xiàng)。適當(dāng)?shù)乩闷渲械倪x項(xiàng)可以使XML配置清晰,但是,有些選項(xiàng),例如autowiring(自動(dòng)綁定),往往會(huì)降低易讀性和易維護(hù)性。文章中所列舉的實(shí)例,可以幫助你創(chuàng)建出清晰易讀的XML配置文件。

    posted on 2006-06-23 08:52 冰川 閱讀(1672) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2006年6月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(14)

    隨筆檔案

    BlogJava的幫助

    朋友的博客

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    快樂工作—享受生活
    主站蜘蛛池模板: 亚洲综合精品网站在线观看| 日韩精品内射视频免费观看| 国产亚洲人成在线影院| 亚洲日韩精品无码专区| 亚洲综合无码一区二区痴汉| 亚洲综合色7777情网站777| 亚洲无圣光一区二区| 亚洲中文无码a∨在线观看| 亚洲成a人片毛片在线| 亚洲国产美女视频| 亚洲av极品无码专区在线观看| 亚洲婷婷第一狠人综合精品| 中文字幕在线观看亚洲视频| 在线观看日本亚洲一区| 亚洲精品无码你懂的| 国产精品亚洲综合网站| 少妇亚洲免费精品| 精品一区二区三区免费| 99xxoo视频在线永久免费观看| 永久看日本大片免费35分钟| 台湾一级毛片永久免费| 午夜色a大片在线观看免费| 免费在线看片网站| 国产亚洲情侣一区二区无| 久久精品国产亚洲AV麻豆不卡| 亚洲激情电影在线| 亚洲国产精品无码久久久秋霞1| 国产一区二区三区亚洲综合| 三级黄色在线免费观看| 一个人免费观看www视频| 亚洲无人区码一二三码区别图片| 亚洲风情亚Aⅴ在线发布| jizz18免费视频| 一级毛片免费播放| 好大好硬好爽免费视频| 亚洲AV中文无码乱人伦在线视色| 亚洲大尺度无码专区尤物| 亚洲一级毛片免费看| 无码日韩人妻AV一区免费l| 亚洲精品免费在线观看| 免费网站看v片在线香蕉|