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

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

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

    posts - 188,comments - 176,trackbacks - 0
    Spring是一個(gè)強(qiáng)有力的java程序框架,其被廣泛應(yīng)用于java的程序中。它用POJO提供了企業(yè)級(jí)服務(wù)。Spring利用依賴注入可以獲得簡(jiǎn)單而有效的測(cè)試能力。Spring beans,依賴關(guān)系,以及服務(wù)所需要的bean都將在配置文件中予以描述,配置文件一般采用XML格式。然而XML配置文件冗長(zhǎng)而不易使用,在你進(jìn)行一個(gè)使用了大量bean的大項(xiàng)目中它將變得難以閱讀和控制。

     

    在這篇文章中我將給你展示12種的有關(guān)Spring XML配置文件的最佳技巧。它們中的一些具有更多的實(shí)際意義,而不僅是最好的技巧。請(qǐng)注意另外一些因素,例如域模型的設(shè)計(jì),會(huì)影響到XML配置,但是這篇文章更關(guān)注于XML配置的可讀性和可操控性。

     

    1. 避免使用自動(dòng)裝配

    Spring可以通過(guò)bean類(lèi)的自省來(lái)實(shí)現(xiàn)自動(dòng)裝配依賴,這樣的話你就不必明確地描述bean的屬性或者構(gòu)造函數(shù)的參數(shù)。根據(jù)屬性名稱活匹配類(lèi)型,bean屬性可以自動(dòng)進(jìn)行裝配。而構(gòu)造函數(shù)可以根據(jù)匹配類(lèi)型自動(dòng)裝配。你甚至可以設(shè)置自動(dòng)裝配進(jìn)行自動(dòng)偵測(cè),這樣Spring替你就會(huì)選擇一個(gè)合適的機(jī)制。請(qǐng)看下面的例子:

     

    Spring可以通過(guò)bean類(lèi)的自省來(lái)實(shí)現(xiàn)自動(dòng)裝配依賴,這樣的話你就不必明確地描述bean的屬性或者構(gòu)造函數(shù)的參數(shù)。根據(jù)屬性名稱活匹配類(lèi)型,bean屬性可以自動(dòng)進(jìn)行裝配。而構(gòu)造函數(shù)可以根據(jù)匹配類(lèi)型自動(dòng)裝配。你甚至可以設(shè)置自動(dòng)裝配進(jìn)行自動(dòng)偵測(cè),這樣Spring替你就會(huì)選擇一個(gè)合適的機(jī)制。請(qǐng)看下面的例子:

     

        <bean id="orderService"

            class="com.lizjason.spring.OrderService"

            autowire="byName"/>

     

    OrderService類(lèi)的屬性名被用來(lái)和容器中的一個(gè)bean實(shí)例進(jìn)行匹配。自動(dòng)裝配會(huì)默默的保存一些類(lèi)型信息并降低混亂。然而,由于它會(huì)犧牲掉這種配置的直觀性和可維護(hù)性,你在實(shí)際的項(xiàng)目中將不會(huì)用到它。許多指南和陳述材料都把它吹捧為Spring的一個(gè)非常cool的特性,而沒(méi)有提到它的這個(gè)缺點(diǎn)。依我之見(jiàn),就像Spring的對(duì)象池一樣,它更多了一些商業(yè)味道。它看起來(lái)好像可以使XML配置文件更精簡(jiǎn)一些,但實(shí)際上卻增加其復(fù)雜性,尤其是在你的較大規(guī)模的工程中已經(jīng)定義了很多bean的時(shí)候更是如此。Spring允許你混合使用自動(dòng)和手動(dòng)裝配,但是這種矛盾會(huì)使XML配置更加的令人費(fèi)解。

     

    2. 使用命名規(guī)范

    和Java編碼的理念一樣,在項(xiàng)目中始終用清晰的,描述性的,一致的命名規(guī)范對(duì)開(kāi)發(fā)人員理解XML配置非常有用。拿bean ID舉例來(lái)說(shuō),你可以遵循Java類(lèi)中屬性的命名規(guī)范。比如說(shuō),OrderServiceDAO的bean ID應(yīng)該是orderServiceDAO。對(duì)于大項(xiàng)目來(lái)說(shuō),在bean ID前加包名來(lái)作為前綴。

     

    3. 使用簡(jiǎn)化格式

    簡(jiǎn)化格式有利于減少冗余,因?yàn)樗褜傩灾岛鸵米鳛閷傩裕皇亲釉亍?聪旅娴睦樱?br>
        <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)化格式書(shū)寫(xiě)為:

        <bean id="orderService"
            class="com.lizjason.spring.OrderService">
            <property name="companyName"
                value="lizjason"/>
            <constructor-arg ref="orderDAO"/>
        </bean>
    簡(jiǎn)化格式在1.2版本時(shí)已經(jīng)可用了,但請(qǐng)注意不存在<ref local="...">這種簡(jiǎn)化格式不僅可以較少你的代碼輸入量,而且可以使XML配置更加的清晰。當(dāng)你的配置文件中存在大量的bean定義時(shí),它可以顯著地提高可讀性。

     

    4. 盡量使用type而不是index去解決構(gòu)造函數(shù)參數(shù)的匹配問(wèn)題

    當(dāng)構(gòu)造函數(shù)中有多個(gè)同類(lèi)型的參數(shù)時(shí),Spring只允許你使用從0開(kāi)始的index或者value標(biāo)簽來(lái)解決這個(gè)問(wèn)題。請(qǐng)看下面的例子:

        <bean id="billingService"
            class="com.lizjason.spring.BillingService">
            <constructor-arg index="0" value="lizjason"/>
            <constructor-arg index="1" value="100"/>
        </bean>
    最好用type屬性取代上面的做法:

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

    用index可以稍微減少冗余,但是它更容易出錯(cuò)且不如type屬性可讀性高。你應(yīng)該僅在構(gòu)造函數(shù)中有參數(shù)沖突時(shí)使用index。

     

    5. 如可能,盡量復(fù)用bean定義

    Spring提供了一種類(lèi)似于繼承的機(jī)制來(lái)降低配置信息的重復(fù)并使XML配置更加的簡(jiǎn)單。一個(gè)子bean可以從它的父bean繼承配置信息,本質(zhì)上這個(gè)父bean就像它的子bean的一個(gè)模板。這是一個(gè)在大型項(xiàng)目中必須使用的特性。所有你要做的就是把父bean的abstract屬性置為true,并在子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 bean繼承了abstractService bean的屬性companyName的值lizjason。注意,如果你為bean聲名一個(gè)class或工廠方法,這個(gè)bean將會(huì)默認(rèn)為abstract

     

    6. 盡量使用ApplicationContext裝配bean,而不是用import

    像Ant腳本中imports一樣,Spring的import 元素對(duì)于模塊化bean的裝配非常有用,例如:

        <beans>
            <import resource="billingServices.xml"/>
            <import resource="shippingServices.xml"/>
            <bean id="orderService"
                class="com.lizjason.spring.OrderService"/>
        <beans>
    然而,比起在XML中用imports預(yù)裝配這些bean,利用ApplicationContext來(lái)配置它們將更加靈活,也可以使XML配置更加的易于管理。你可以像下面這樣傳遞一個(gè)bean定義數(shù)組到ApplicationContext的構(gòu)造函數(shù)中:

        String[] serviceResources =

            {"orderServices.xml",

            "billingServices.xml",

            "shippingServices.xml"};

    ApplicationContext orderServiceContext = new

    ClassPathXmlApplicationContext(serviceResources);

     

    7. 用id來(lái)標(biāo)識(shí)bean

    你可以用id或名字作為bean的標(biāo)識(shí)。用id可讀性較差,但是它可以影響XML分析器使bean的reference有效。如果id由于XML IDREF約束而無(wú)法使用,你可以用name作為bean的標(biāo)識(shí)。XML IDREF約束是指id必須以字母開(kāi)始(或者是在XML聲名了的一個(gè)標(biāo)點(diǎn)符號(hào)),后面可以是字母,數(shù)字,連字符,下劃線,冒號(hào)或full stops(不知道怎么翻譯好)。在實(shí)際應(yīng)用中很少會(huì)遇到XML IDREF約束問(wèn)題。

     

    8. 在開(kāi)發(fā)階段使用依賴檢查

    你可以為bean的dependency-check屬性設(shè)置一個(gè)值來(lái)取代默認(rèn)的none,比如說(shuō)simple,objects或者all,這樣的話容器將替你做依賴有效性的檢查。當(dāng)一個(gè)bean的所有屬性(或者某些屬性目錄)都被明確設(shè)置,或利用自動(dòng)裝配時(shí)將會(huì)非常有用。

        <bean id="orderService"
            class="com.lizjason.spring.OrderService"
            dependency-check="objects">
            <property name="companyName"
                value="lizjason"/>
            <constructor-arg ref="orderDAO"/>
        </bean>
    在這個(gè)例子中,容器將確保這些屬性不是privitives或者保證collections是為orderService bean設(shè)置的。為所有的bean設(shè)置默認(rèn)的依賴檢查是可能的,但這個(gè)特性由于有些bean的屬性不需要設(shè)置而很少使用。

     

    9. 為每個(gè)配置文件加一個(gè)描述注釋

    在XML配置文件中最好使用有描述性的id和name,而不是成堆的注釋。另外,加一個(gè)文件描述頭將會(huì)非常有用,這個(gè)描述可以概括文件中定義的bean。另一個(gè)選擇,你可以在description元素中加入描述信息。例如:

        <beans>
            <description>
                This file defines billing service
                related beans and it depends on
                baseServices.xml,which provides
                service bean templates...
            </description>
            ...
        </beans>
    用description元素的一個(gè)好處就是工具可以很容易的把描述信息從這個(gè)元素中提取出來(lái)。

     

    10.   和team members溝通變更

    當(dāng)你修改java源碼后,要確保更改了配置文件中的相應(yīng)部分并把這個(gè)情況告知你的team members。XML配置文件也是代碼,它們是程序的重要組成部分,但它們很難閱讀和維護(hù)。大多數(shù)時(shí)間里,你需要同時(shí)看XML配置文件和java代碼才能知道是怎么回事。

     

    11.   setter注入和構(gòu)造函數(shù)注入,優(yōu)先使用前者

    Spring提供了三種注入方式:構(gòu)造函數(shù)注入,setter注入和方法注入。一般我們使用前兩種。

        <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 bean用了構(gòu)造函數(shù)注入,而B(niǎo)illingService bean用了setter注入。構(gòu)造函數(shù)注入可以確保bean正確地構(gòu)建,但是setter注入更加的靈活和易于控制,特別是當(dāng)class有多個(gè)屬性并且它們中的一些是可選的情況是更是如此。

     

    12.   不要濫用注入

    就像前面提到的,Spring的ApplicationContext可以替你創(chuàng)建java對(duì)象,但不是所有的java對(duì)象都應(yīng)該通過(guò)注入創(chuàng)建。例如,域?qū)ο缶筒粦?yīng)該通過(guò)ApplicationContext創(chuàng)建。Spring是一個(gè)優(yōu)秀的框架,但是考慮到可讀性和可操控性,基于XML配置的配置會(huì)在定義很多bean的時(shí)候出現(xiàn)麻煩。過(guò)渡使用依賴注入將會(huì)使XML配置更加的復(fù)雜和冗長(zhǎng)。切記,當(dāng)使用高效的IDE時(shí),例如Eclipse and IntelliJ,java代碼更加的易于閱讀,維護(hù)和管理比使XML文件

     

    結(jié)論

    XML是Spring流行的配置格式。存在大量bean定義時(shí),基于XML的配置會(huì)變得冗長(zhǎng)而不易使用。Spring提供了豐富的配置選項(xiàng)。適當(dāng)?shù)厥褂眠@些選項(xiàng)可以使XML配置更加的清晰,但其它的一些選項(xiàng),例如自動(dòng)裝配,可能會(huì)降低可讀性和可維護(hù)性。參考本文中提到的這些技巧可能會(huì)幫助你創(chuàng)建干凈而易讀的XML配置文件


    轉(zhuǎn)CSDN

    posted on 2007-05-24 11:37 cheng 閱讀(445) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Spring

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: a毛片免费全部在线播放**| 亚洲av午夜精品一区二区三区| 青青草97国产精品免费观看| 亚洲区精品久久一区二区三区| 国产成人亚洲精品91专区手机| 在线免费观看色片| 久草视频在线免费| 无码精品国产一区二区三区免费| 一级A毛片免费观看久久精品 | 亚洲综合小说另类图片动图 | 永久免费AV无码网站国产| 香港经典a毛片免费观看看| 亚洲熟妇无码一区二区三区导航| 亚洲激情电影在线| 亚洲高清视频在线观看| 黑人精品videos亚洲人| 亚洲偷自拍拍综合网| 亚洲成AV人在线观看网址| 男女交性永久免费视频播放| 无码少妇一区二区浪潮免费| 亚洲人成免费网站| 亚洲电影在线免费观看| 91精品免费久久久久久久久| 亚洲电影免费在线观看| 在线观看免费av网站| 久草视频在线免费看| 久久久久久久岛国免费播放 | 日本免费一区二区三区最新vr| 最近高清国语中文在线观看免费| 国产日本一线在线观看免费| 中文字幕乱码免费视频| 国产免费毛不卡片| 成人一a毛片免费视频| 成人av免费电影| 免费国产高清视频| 亚洲国产成人a精品不卡在线 | 水蜜桃视频在线观看免费播放高清| 国产免费牲交视频免费播放 | 亚洲精品V欧洲精品V日韩精品| 中文字幕亚洲一区| 久久久久亚洲精品影视|