使用索引可以稍稍减少一些冗长,但是和使用类型属性相比,它还是有容易发生错误的倾向和难于阅读的缺点。你应该只有在
构造器条目
不明确的时候,才使用索引这一方法。
5.
如果可能,
可以继承已定义过的bean
Spring
提供一种像继承一样的机制来减少配置信息的复制并简化XML配置。定义一个子类可以从它父类那里继承配置信息,而父类实质上作为子类的一个模板。这就是大工程中所谓的重用。你所需要做的就是抽象并真实地说明父类和子类中父类的
参数
。例如:
<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。如果你没有为一个bean指明类或factory方法,那么这个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>
但是,使用引用在XML配置中来预装配他们已经不用了,而是通过ApplicationContext来配置他们,这样显得更加灵活。利用ApplicationContext也使得XML配置易于管理。你可以像下面的例子那样在ApplictionContext构造器里布置bean:
String[] serviceResources =
{"orderServices.xml",
"billingServices.xml",
"shippingServices.xml"};
ApplicationContext orderServiceContext = new
ClassPathXmlApplicationContext(serviceResources);
7.
利用id作为bean的标识符
你可以指定一个id或名称来作为bean的标识符。虽然使用id不会提高易读性,但是它在XML剖析器对bean参考有效方面起到了平衡的作用。如果由于XML IDREF容器的原因不能使用id,你可以利用名称来作为bean的标识符。XML IDREF容器的原则使id必须以字母开头(或者定义在XML规范中的标点符号),后面接着字母,数字,连字号,下划线,冒号或者
句号
。在现实中,遇到XML IDREF容器问题是很少见的。
8.
在开发阶段使用从属检测
你可以在一定的bean中给从属检测的属性设置值,而不采用原先默认的空值,属性设置例如simple,object或all,以便容器进行
从属确认
。当bean的全部的属性(或某些种类的属性)需要被明确设置或自动绑定时,它便显得很有用。
<bean id="orderService"
class="com.lizjason.spring.OrderService"
dependency-check="objects">
<property name="companyName"
value="lizjason"/>
<constructor-arg ref="orderDAO"/>
</bean>
在这个例子里,
容器确保为orderService bean设置的属性不是原始的
。它可能为所有的bean设置默认的从属检测,但是这个特性很少使用,是因为有些bean的属性不必设置。
9. 为每个配置文件加上一个标题注释
首选descriptive id和名称来代替在XML配置文件中的注释。此外,加上一个配置文件标题很有用处,它可以概述文件中所定义的bean。你可以选择将descpription(的内容)加入description标签中。例如:
<
beans
>
<
description
>
This file defines billing service
related beans and it depends on
baseServices.xml,which provides
service bean templates
</
description
>
</
beans
>
使用description标签的一个好处是可以容易地利用工具从标签中选取出description(的内容)。
10.对于变化变更,要与队友积极交流
当你重构Java代码时,你需要随时更新配置文件并且通知队友。XML配置文件也是代码,它们是应用程序的至关重要的部分,但是它们难于阅读和维护。大部分时间你既要阅读XML配置文件又要阅读运行中的Java代码。
11.Setter injection
(镶嵌注入)优于
constructor injection
(构造器注入)
Spring
提供3种类型的从属注入: constructor injectio(构造器注入),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>
这个例子中,orderService类使用的是constructor injection(构造器注入),而BillingService类使用的是setter injection(镶嵌注入)。constructor injection(构造器注入)可以确保bean不能在一个非法声明下创建,但是setter injection(镶嵌注入)更加灵活并且更易管理,尤其当类存在复合属性并且属性中的一些是可选的。
12.
不要滥用从属注入
作为最后一点,Spring ApplicationContext可以替你创建Java对象,但是并不是所有的Java对象都通过从属注入来创建的。例如,全局的对象不应该通过ApplicationContext来创建。Spring是一个很棒的框架,但是,就易读性和易管理性而言,当定义大量bean的时候,基于XML的配置问题就会突出。过度的从属注入会使XML配置变得复杂而且臃肿。记住!在强大的IDE时,例如Eclipse和IntelliJ,与XML文件相比,Java代码更加易读,易维护,易管理。
总结
对于Spring的配置,XML是很流行的形式。但当定义大量bean时,基于XML配置会变得冗长,笨拙。Spring提供了丰富的配置选项。适当地利用其中的选项可以使XML配置清晰,但是,有些选项,例如autowiring(自动绑定),往往会降低易读性和易维护性。文章中所列举的实例,可以帮助你创建出清晰易读的XML配置文件。
关于作者:
Jason Zhicheng Li
是Object Computing, Inc. in St. Louis, MO(公司)一名资深的软件工程师。