Twelve Best Practices For Spring XML Configurations 原稿位置: http://www./pub/a/onjava/2006/01/25/spring-xml-configuration-best-practices.html by Jason Zhicheng Li
Spring是一個強有力的java程序框架,其被廣泛應(yīng)用于java的程序中。它用POJO提供了企業(yè)級服務(wù)。Spring利用依賴注入可以獲得簡單而有效的測試能力。Spring beans,依賴關(guān)系,以及服務(wù)所需要的bean都將在配置文件中予以描述,配置文件一般采用XML格式。然而XML配置文件冗長而不易使用,在你進行一個使用了大量bean的大項目中它將變得難以閱讀和控制。 在這篇文章中我將給你展示12種的有關(guān)Spring XML配置文件的最佳技巧。它們中的一些具有更多的實際意義,而不僅是最好的技巧。請注意另外一些因素,例如域模型的設(shè)計,會影響到XML配置,但是這篇文章更關(guān)注于XML配置的可讀性和可操控性。 1. 避免使用自動裝配 Spring可以通過bean類的自省來實現(xiàn)自動裝配依賴,這樣的話你就不必明確地描述bean的屬性或者構(gòu)造函數(shù)的參數(shù)。根據(jù)屬性名稱活匹配類型,bean屬性可以自動進行裝配。而構(gòu)造函數(shù)可以根據(jù)匹配類型自動裝配。你甚至可以設(shè)置自動裝配進行自動偵測,這樣Spring替你就會選擇一個合適的機制。請看下面的例子: Spring可以通過bean類的自省來實現(xiàn)自動裝配依賴,這樣的話你就不必明確地描述bean的屬性或者構(gòu)造函數(shù)的參數(shù)。根據(jù)屬性名稱活匹配類型,bean屬性可以自動進行裝配。而構(gòu)造函數(shù)可以根據(jù)匹配類型自動裝配。你甚至可以設(shè)置自動裝配進行自動偵測,這樣Spring替你就會選擇一個合適的機制。請看下面的例子: <bean id="orderService" class="com.lizjason.spring.OrderService" autowire="byName"/> OrderService類的屬性名被用來和容器中的一個bean實例進行匹配。自動裝配會默默的保存一些類型信息并降低混亂。然而,由于它會犧牲掉這種配置的直觀性和可維護性,你在實際的項目中將不會用到它。許多指南和陳述材料都把它吹捧為Spring的一個非常cool的特性,而沒有提到它的這個缺點。依我之見,就像Spring的對象池一樣,它更多了一些商業(yè)味道。它看起來好像可以使XML配置文件更精簡一些,但實際上卻增加其復(fù)雜性,尤其是在你的較大規(guī)模的工程中已經(jīng)定義了很多bean的時候更是如此。Spring允許你混合使用自動和手動裝配,但是這種矛盾會使XML配置更加的令人費解。 2. 使用命名規(guī)范 和Java編碼的理念一樣,在項目中始終用清晰的,描述性的,一致的命名規(guī)范對開發(fā)人員理解XML配置非常有用。拿bean ID舉例來說,你可以遵循Java類中屬性的命名規(guī)范。比如說,OrderServiceDAO的bean ID應(yīng)該是orderServiceDAO。對于大項目來說,在bean ID前加包名來作為前綴。 3. 使用簡化格式 簡化格式有利于減少冗余,因為它把屬性值和引用作為屬性,而不是子元素??聪旅娴睦樱?/font>
以上程序可以重新以簡化格式書寫為:
簡化格式在1.2版本時已經(jīng)可用了,但請注意不存在<ref local="...">這種簡化格式不僅可以較少你的代碼輸入量,而且可以使XML配置更加的清晰。當你的配置文件中存在大量的bean定義時,它可以顯著地提高可讀性。 4. 盡量使用type而不是index去解決構(gòu)造函數(shù)參數(shù)的匹配問題 當構(gòu)造函數(shù)中有多個同類型的參數(shù)時,Spring只允許你使用從0開始的index或者value標簽來解決這個問題。請看下面的例子:
最好用type屬性取代上面的做法:
用index可以稍微減少冗余,但是它更容易出錯且不如type屬性可讀性高。你應(yīng)該僅在構(gòu)造函數(shù)中有參數(shù)沖突時使用index。 5. 如可能,盡量復(fù)用bean定義 Spring提供了一種類似于繼承的機制來降低配置信息的重復(fù)并使XML配置更加的簡單。一個子bean可以從它的父bean繼承配置信息,本質(zhì)上這個父bean就像它的子bean的一個模板。這是一個在大型項目中必須使用的特性。所有你要做的就是把父bean的abstract屬性置為true,并在子bean中加以引用。例如:
shippingService bean繼承了abstractService bean的屬性companyName的值lizjason。注意,如果你為bean聲名一個class或工廠方法,這個bean將會默認為abstract
然而,比起在XML中用imports預(yù)裝配這些bean,利用ApplicationContext來配置它們將更加靈活,也可以使XML配置更加的易于管理。你可以像下面這樣傳遞一個bean定義數(shù)組到ApplicationContext的構(gòu)造函數(shù)中: String[] serviceResources = {"orderServices.xml", "billingServices.xml", "shippingServices.xml"}; ApplicationContext orderServiceContext = new ClassPathXmlApplicationContext(serviceResources); 7. 用id來標識bean 你可以用id或名字作為bean的標識。用id可讀性較差,但是它可以影響XML分析器使bean的reference有效。如果id由于XML IDREF約束而無法使用,你可以用name作為bean的標識。XML IDREF約束是指id必須以字母開始(或者是在XML聲名了的一個標點符號),后面可以是字母,數(shù)字,連字符,下劃線,冒號或full stops(不知道怎么翻譯好)。在實際應(yīng)用中很少會遇到XML IDREF約束問題。 8. 在開發(fā)階段使用依賴檢查 你可以為bean的dependency-check屬性設(shè)置一個值來取代默認的none,比如說simple,objects或者all,這樣的話容器將替你做依賴有效性的檢查。當一個bean的所有屬性(或者某些屬性目錄)都被明確設(shè)置,或利用自動裝配時將會非常有用。
在這個例子中,容器將確保這些屬性不是privitives或者保證collections是為orderService bean設(shè)置的。為所有的bean設(shè)置默認的依賴檢查是可能的,但這個特性由于有些bean的屬性不需要設(shè)置而很少使用。 9. 為每個配置文件加一個描述注釋 在XML配置文件中最好使用有描述性的id和name,而不是成堆的注釋。另外,加一個文件描述頭將會非常有用,這個描述可以概括文件中定義的bean。另一個選擇,你可以在
用
Spring提供了三種注入方式:構(gòu)造函數(shù)注入,setter注入和方法注入。一般我們使用前兩種。
在這個例子中,orderService bean用了構(gòu)造函數(shù)注入,而 12. 不要濫用注入 就像前面提到的,Spring的 結(jié)論 |
|