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

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

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

    Let's go inside

    this blog is deprecated as a result of laziness.
    posts - 59, comments - 2, trackbacks - 0, articles - 0

    Spring XML配置十二個(gè)最佳實(shí)踐

    Posted on 2006-09-14 02:24 Earth 閱讀(250) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java

    Spring是一個(gè)強(qiáng)大的JAVA應(yīng)用框架,廣泛地應(yīng)用于JAVA的應(yīng)用程序。為Plain Old Java Objects(POJOs)提供企業(yè)級(jí)服務(wù)。Spring利用依賴注入機(jī)制來(lái)簡(jiǎn)化工作,同時(shí)提高易測(cè)性。Spring beans及依賴,以及beans類(lèi)所需的服務(wù)都在配置文件中進(jìn)行了詳細(xì)的說(shuō)明,這個(gè)配置文件是典型的XML格式。但是它既冗長(zhǎng)又不實(shí)用。對(duì)于需要定義大量Spring beans的大工程來(lái)說(shuō),我們難以閱讀和管理它。

    版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必保留以下作者信息和鏈接
    作者:Jason;Li;evenbetter(作者的blog:http://blog.matrix.org.cn/page/evenbetter)
    原文:http://www.onjava.com/pub/a/onjava/2006/01/25/spring-xml-configuration-best-practices.html
    譯文:http://www.matrix.org.cn/resource/article/44/44236_Spring+XML+Configurations.html
    關(guān)鍵字:Spring;XML;Configurations

    在這篇文章里,對(duì)于Spring XML的配置,我將向你展示12種比較好的實(shí)踐。其中的一些實(shí)踐不僅是好的實(shí)踐,更是必要的實(shí)踐。除此以外,還有其他因素,例如領(lǐng)域模型的設(shè)計(jì),都能影響XML的配置,但是這篇文章重點(diǎn)研究XML配置的易讀性和易管理性。

    1。不要使用autowiring

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

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

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

    2.使用通俗的命名

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

    3. 使用簡(jiǎn)潔的形式

    簡(jiǎn)潔形式避免了冗長(zhǎng),是因?yàn)樗鼜淖釉刂袑傩灾岛蛥⒖紝?xiě)到屬性中。例如下面的例子:

    ? < bean? id ="orderService" ????????class ="com.lizjason.spring.OrderService" > ??
    ???
    < property? name ="companyName" > ???????
    ???
    < value > lizjason </ value > ?????
    ?
    </ property > ???????

    ?< constructor-arg > ???????????
    ????? < ref? bean ="orderDAO" > ???
    ???
    </ constructor-arg > ??
    ?
    </ bean >

    可以使用簡(jiǎn)潔形式將上述代碼重寫(xiě)為:

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

    簡(jiǎn)潔形式功能在1.2版本中可以使用。對(duì)于<ref local="...">沒(méi)有簡(jiǎn)潔形式。
    簡(jiǎn)潔形式不但可以節(jié)約你的打字,而且可以使XML配置文件清晰。它最引人注目的是當(dāng)在一個(gè)配置文件中有大量定義的類(lèi)時(shí)可以提高易讀性。

    4. 對(duì)于構(gòu)造器參數(shù)匹配,類(lèi)型名比序號(hào)好。

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

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

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

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

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

    5. 盡可能重用已定義過(guò)的bean

    Spring提供一種類(lèi)似繼承一樣的機(jī)制來(lái)減少配置信息的復(fù)制并簡(jiǎn)化XML配置。定義一個(gè)子類(lèi)可以從它父類(lèi)那里繼承配置信息,而父類(lèi)實(shí)質(zhì)上作為子類(lèi)的一個(gè)模板。這就是大工程中所謂的重用。你所需要做的就是在父類(lèi)bean中設(shè)置abstract=true,然后在子bean注明它自己的父類(lèi)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類(lèi)從abstractService類(lèi)那里繼承companyName屬性的值——lizjason。如果你沒(méi)有為一個(gè)bean指明類(lèi)或factory方法,那么這個(gè)bean便是抽象的。

    6. 盡量使用ApplicationContext來(lái)裝配定義的bean

    像在Ant腳本中的引用一樣,Spring的引用對(duì)于裝配模塊化的bean來(lái)說(shuō)是很有用的。例如:

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

    相對(duì)于使用import在XML配置中來(lái)預(yù)裝配,通過(guò)ApplicationContext來(lái)配置這些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)識(shí)符

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

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

    你可以在bean中給依賴檢驗(yàn)的屬性設(shè)置值,而不采用原先默認(rèn)的空值,屬性設(shè)置例如simple,object或all,以便容器進(jìn)行依賴檢驗(yàn)。當(dāng)bean的全部的屬性(或某類(lèi)屬性)需要被明確設(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)依賴檢測(cè)也是可以的,但是我們很少這樣做,是因?yàn)橛行゜ean的屬性根本就不必設(shè)置。

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

    最好使用descriptive id和名稱來(lái)代替在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ì)于任何變化,要與隊(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種類(lèi)型的依賴注入: constructor injection,setter injection, 和method injection。我們一般只用前兩種類(lèi)型。

    ??? <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類(lèi)使用的是constructor injection,而B(niǎo)illingService類(lèi)使用的是setter injection。constructor injection可以確保bean不會(huì)在一個(gè)非法狀態(tài)下被創(chuàng)建,但是setter injection更加靈活并且更易管理,尤其當(dāng)類(lèi)存在很多屬性并且其中一些是可選的情況下。

    12. 不要濫用依賴注入

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

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

    關(guān)于作者:
    Jason Zhicheng Li是Object Computing, Inc. in St. Louis, MO(公司)一名資深的軟件工程師。

    主站蜘蛛池模板: 国产亚洲AV夜间福利香蕉149| 国产精品免费大片| 成人免费视频小说| 亚洲国产成a人v在线| 亚洲精品在线免费观看视频| 亚洲天堂中文字幕| 6080午夜一级毛片免费看6080夜福利| 亚洲国产精华液网站w| 午夜网站在线观看免费完整高清观看| 好看的电影网站亚洲一区| 国产精品白浆在线观看免费| 亚洲av永久无码精品古装片| 午夜精品一区二区三区免费视频 | 亚洲影院在线观看| 亚洲一级毛片免费观看| 亚洲H在线播放在线观看H| 黄色成人网站免费无码av| 亚洲精品无码mⅴ在线观看| 国产乱人免费视频| 精品国产福利尤物免费| 亚洲天堂一区二区| 韩国免费三片在线视频| a毛片成人免费全部播放| 亚洲精品国产精品乱码视色| 亚洲国产精品免费在线观看| 亚洲欧美日韩一区二区三区在线| 啊灬啊灬别停啊灬用力啊免费看| 中文字幕免费在线看| 亚洲黄色高清视频| 国产成人无码免费视频97| 中文字幕永久免费| 亚洲一级片在线观看| 亚洲AV中文无码乱人伦在线视色| 日本道免费精品一区二区| 亚洲国产日韩综合久久精品| 亚洲精品第一国产综合境外资源 | 国产啪精品视频网免费| 国产精品无码亚洲精品2021| 337p日本欧洲亚洲大胆裸体艺术| 8x网站免费入口在线观看| 阿v视频免费在线观看|