Spring XML配置十二个最佳实践

在这篇文章里,对于 Spring XML 的配置,我将向你展示12 种比较好的实践。其中的一些实践不仅是好的实践,更是必要的实践。除此以外,还有其他因素,例如领域模型的设计,都能影响XML 的配置,但是这篇文章重点研究XML 配置的易读性和易管理性。

   1 。不要使用autowiring

  Spring 可以通过类的自省来自动绑定其依赖部分,使得你不必明确指明bean 的属性和构造器。Bean 的属性可以通过属性名称或类型匹配来实现自动绑定。构造器通过类型匹配来实现自动绑定。你甚至可以指定自动检测自动绑定模式,它可以引导 Spring 选择一种适当的运行机制。先来看看下面的一个例子:

  

以下是引用片段:
< bean id="orderService" class="com.lizjason.spring.OrderService" autowire="byName"/>

  OrderService 类的属性名在容器中用于匹配bean 实例。自动绑定可以潜在地节省一些打字和减少一些混乱。但是在现实世界的工程里你不应该使用这种方式,这是因为它牺牲了配置的清晰性和可维护性。许多指南和介绍中大量吹捧自动绑定是Spring 的一种极好的特征而没有提到这一特性所带来的牺牲。依我的观点,这就像 Spring 中的object-pooling ,它更像是一种为了占据更多市场的商业特征。它对于XML 配置文件的小巧化是一个好办法,但实际上也增加了复杂程度,尤其当你运行有大量类声明的工程时。虽然Spring 允许你混合自动绑定和手动绑定,但是这个矛盾会使XML 配置更加晦涩难懂。

   2. 使用通俗的命名

  这个方式对于Java 编码也一样适用。在工程中使用清晰的、描述性的、协调的通俗名称对于开发者理解XML 配置是十分有益的。例如对于bean ID ,你可以根据通俗的Java 类名来命名它。对于例子中OrderServiceDAObean ID 命名为orderServiceDAO 。对于大的工程,你可以在bean ID 前面加上包名作为前缀。

   3. 使用简洁的形式

  简洁形式避免了冗长,是因为它从子元素中将属性值和参考写到属性中。例如下面的例子:

  

以下是引用片段:
< bean id="orderService"
  class="com.lizjason.spring.OrderService">
  < property name="companyName">
  < value>lizjason< /value>
  < /property>
  < constructor-arg>
  < ref bean="orderDAO">
  < /constructor-arg>
  < /bean>
  可以使用简洁形式将上述代码重写为:
  < bean id="orderService"
  class="com.lizjason.spring.OrderService">
  < property name="companyName"
  value="lizjason"/>
  < constructor-arg ref="orderDAO"/>
  < /bean>

  简洁形式功能在1.2 版本中可以使用。对于< ref local="..."> 没有简洁形式。

  简洁形式不但可以节约你的打字,而且可以使XML 配置文件清晰。它最引人注目的是当在一个配置文件中有大量定义的类时可以提高易读性。

   4. 对于构造器参数匹配,类型名比序号好。

  当一个构造器含有一个以上的同种类型的参数,或者属性值的标签已经被占用时,Spring 允许你使用从0 计数的序号来解决这些会带来混淆的问题。例如:

  

以下是引用片段:
< bean id="billingService"
  class="com.lizjason.spring.BillingService">
  < constructor-arg index="0" value="lizjason"/>
  < constructor-arg index="1" value="100"/>
  < /bean>

  像下面这样,利用类型属性来编写会更好一些:

  

以下是引用片段:
< bean id="billingService"
  class="com.lizjason.spring.BillingService">
  < constructor-arg type="java.lang.String"
  value="lizjason"/>
  < constructor-arg type="int" value="100"/>
  < /bean>

 

  使用索引可以稍稍减少一些冗长,但是和使用类型属性相比,它还是有容易发生错误的倾向和难于阅读的缺点。你应该只在构造器参数不明确的时候,才使用索引这一方法。

   5. 尽可能重用已定义过的bean

  Spring 提供一种类似继承一样的机制来减少配置信息的复制并简化XML 配置。定义一个子类可以从它父类那里继承配置信息,而父类实质上作为子类的一个模板。这就是大工程中所谓的重用。你所需要做的就是在父类bean 中设置abstract=true ,然后在子bean 注明它自己的父类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 类从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>

相对于使用importXML 配置中来预装配,通过ApplicationContext 来配置这些beans ,显得更加灵活。利用 ApplicationContext 也使得XML 配置易于管理。你可以像下面的例子那样在ApplictionContext 构造器里布置bean

  

以下是引用片段:
String[] serviceResources =
  {"orderServices.xml",
  "billingServices.xml",
  "shippingServices.xml"};
  ApplicationContext orderServiceContext = new
  ClassPathXmlApplicationContext(serviceResources);

   7. 利用id 作为bean 的标识符

  你可以指定一个id 或名称来作为bean 的标识符。虽然使用id 不会提高易读性,但是它可以让XML parserbean 的引用有效方面进行更好的验证。如果由于XML IDREF 的限制而不能使用某个id ,你可以利用names 来作为bean 的标识符。XML IDREF 的限制是id 必须以字母开头( 或者在XML 规范中定义的标点符号) ,后面接着字母,数字,连字号,下划线,冒号等。实际上,遇到XML IDREF 限制的问题是很少见的。

   8. 在开发阶段使用依赖检验

  你可以在bean 中给依赖检验的属性设置值,而不采用原先默认的空值,属性设置例如simpleobjectall ,以便容器进行依赖检验。当bean 的全部的属性( 或某类属性) 需要被明确设置或自动绑定时,依赖检验便显得很有用。

  

以下是引用片段:
< bean id="orderService"
  class="com.lizjason.spring.OrderService"
  dependency-check="objects">
  < property name="companyName"
  value="lizjason"/>
  < constructor-arg ref="orderDAO"/>
  < /bean>

  在这个例子里,容器确保为orderService bean 设置的属性不是primitives 或者 collections 。为所有的bean 设置默认依赖检测也是可以的,但是我们很少这样做,是因为有些bean 的属性根本就不必设置。

   9. 为每个配置文件加上一个header comment

  最好使用descriptive id 和名称来代替在XML 配置文件中的注释。此外,加上一个配置文件header 也很有用处,它可以概述文件中所定义的bean 。你可以选择将描述内容加入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 injection,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 injectionconstructor injection 可以确保bean 不会在一个非法状态下被创建,但是setter injection 更加灵活并且更易管理,尤其当类存在很多属性并且其中一些是可选的情况下。

   12. 不要滥用依赖注入

  作为最后一点,Spring ApplicationContext 可以替你创建Java 对象,但是并不是所有的Java 对象都通过依赖注入来创建的。例如,全局的对象不应该通过 ApplicationContext 来创建。Spring 是一个很棒的框架,但是,就易读性和易管理性而言,当定义大量bean 的时候,基于XML 的配置问题就会突出。过度的依赖注入会使XML 配置变得复杂而且臃肿。记住! 使用强大的IDE 时,例如EclipseIntelliJ ,与XML 文件相比, Java 代码更加易读,易维护,易管理。

   总结

  对于Spring 的配置,XML 是很优秀的方式。但当定义大量 bean 时,基于XML 配置会变得冗长,笨拙。Spring 提供了丰富的配置选项。适当地利用其中的选项可以使XML 配置清晰,但是,有些选项,例如 autowiring( 自动绑定) ,往往会降低易读性和易维护性。文章中所列举的实例,可以帮助你创建出清晰易读的XML 配置文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值