Spring中XML配置文件的十二個最佳方法(上)
1。避免使用自動綁定(autowiring)功能
Spring 可以通過bean類的自省自動綁定依賴性,所以不必顯式指明bean的屬性和構(gòu)造函數(shù)。Bean屬性可以通過屬性名稱或類型匹配來實現(xiàn)自動綁定。構(gòu)造函數(shù)通過類型匹配來實現(xiàn)自動綁定。甚至可以指定自動檢測autowiring模式,它可以引導(dǎo)Spring選擇一種適當(dāng)?shù)倪\行機制。先來看看下面的一個例子:
- <bean id="orderService"
- class="com.lizjason.spring.OrderService"
- autowire="byName"/>
OrderService 類的屬性名在容器中用于匹配bean實例。自動綁定可能會節(jié)省一些鍵入工作量并減少混亂。但是在現(xiàn)實項目中不應(yīng)該使用這種方式,因為它犧牲了配置的可讀性和可維護性。許多指南和介紹中大肆吹捧自動綁定是Spring的一項極好的特性,而沒有提到這一特性所帶來的犧牲。依我來看,這就像Spring中的對象池(object-pooling),更大程度上只是宣傳的噱頭。對于精簡XML配置文件來說,它是一個好辦法,但它實際上增加了復(fù)雜性,尤其是在運行包含大量類聲明的項目時。雖然Spring允許混合使用自動綁定和顯式綁定,但這會使XML配置更加晦澀難懂。
2.使用命名約定
該原則對于Java編碼也一樣適用。在項目中使用清晰的、描述性的、一致的命名約定將非常有利于開發(fā)人員理解XML配置。例如,對于bean ID,可以按照Java類字段名約定來命名它。OrderServiceDAO實例的bean ID應(yīng)該命名為orderServiceDAO。對于大型項目,可以在bean ID前面加上包名作為前綴。
3. 使用簡潔形式
簡潔形式避免了冗長,因為它將屬性值和引用從子元素中移入屬性中。例如下面的例子:
- <bean id="orderService"
- class="com.lizjason.spring.OrderService">
- <property name="companyName">
- <value>lizjason< SPAN>value>
- < SPAN>property>
- <constructor-arg>
- <ref bean="orderDAO">
- < SPAN>constructor-arg>
- < SPAN>bean>
可以使用簡潔形式將上述代碼重寫為:
- <bean id="orderService"
- class="com.lizjason.spring.OrderService">
- <property name="companyName"
- value="lizjason"/>
- <constructor-arg ref="orderDAO"/>
- < SPAN>bean>
簡潔形式自1.2版本起就可以使用。注意,對于,沒有簡潔形式。
簡潔形式不但可以節(jié)約鍵入工作量,而且可以使XML配置文件更清晰。當(dāng)一個配置文件中定義了大量的類時,它可以顯著提高可讀性。
4. 對于構(gòu)造函數(shù)參數(shù)匹配,類型比下標(biāo)好
當(dāng)構(gòu)造函數(shù)含有一個以上同種類型的參數(shù),或者屬性值的標(biāo)簽已經(jīng)被占用時,Spring允許使用從0開始的下標(biāo)來避免混淆。例如:
- <bean id="billingService"
- class="com.lizjason.spring.BillingService">
- <constructor-arg index="0" value="lizjason"/>
- <constructor-arg index="1" value="100"/>
- < SPAN>bean>
利用type屬性來編寫會更好一些,如下:
- <bean id="billingService"
- class="com.lizjason.spring.BillingService">
- <constructor-arg type="java.lang.String"
- value="lizjason"/>
- <constructor-arg type="int" value="100"/>
- < SPAN>bean>
使用index可以減少一些代碼,但是與type屬性相比,它更易于出錯且難于閱讀。只有在構(gòu)造函數(shù)參數(shù)不明確的時候,才應(yīng)該使用index。
5. 盡可能重用已定義的bean
Spring 提供了一種類似于繼承的機制來減少配置信息的復(fù)制并簡化XML配置。定義一個子類,它就可以從父類那里繼承配置信息,而父類實際上成為子類的一個模板。這就是大型項目中所謂的重用。只需在父類bean中設(shè)置abstract=true,然后在子bean中指定parent引用。例如:
- <bean id="abstractService" abstract="true"
- class="com.lizjason.spring.AbstractService">
- <property name="companyName"
- value="lizjason"/>
- < SPAN>bean>
- <bean id="shippingService"
- parent="abstractService"
- class="com.lizjason.spring.ShippingService">
- <property name="shippedBy" value="lizjason"/>
- < SPAN>bean>
ShippingService類從abstractService類繼承companyName屬性的值——lizjason。如果一個bean沒有指定類或工廠方法,那么這個bean便是抽象的。
6. 在導(dǎo)入時,***通過ApplicationContext來匯編bean定義
像Ant腳本中的導(dǎo)入一樣,Spring的import元素對于匯編模塊化的bean定義來說是很有用的。例如:
- <beans>
- <import resource="billingServices.xml"/>
- <import resource="shippingServices.xml"/>
- <bean id="orderService"
- class="com.lizjason.spring.OrderService"/>
- <beans>
然而,相對于使用import在XML配置中進行預(yù)匯編,通過ApplicationContext來配置這些bean則顯得更加靈活。使用 ApplicationContext的話,XML配置也更易于管理??梢韵駻pplictionContext構(gòu)造函數(shù)傳遞一組bean定義,如下:
- String[] serviceResources =
- {"orderServices.xml",
- "billingServices.xml",
- "shippingServices.xml"};
- ApplicationContext orderServiceContext = new
- ClassPathXmlApplicationContext(serviceResources);
【編輯推薦】