Spring XML配置的12个技巧

原稿位置:
by Jason Zhicheng Li
01/25/2006
 
Spring 是一个强有力的 java 程序框架,其被广泛应用于 java 的程序中。它用 POJO 提供了企业级服务。 Spring 利用依赖注入可以获得简单而有效的测试能力。 Spring beans ,依赖关系,以及服务所需要的 bean 都将在配置文件中予以描述,配置文件一般采用 XML 格式。然而 XML 配置文件冗长而不易使用,在你进行一个使用了大量 bean 的大项目中它将变得难以阅读和控制。
 
在这篇文章中我将给你展示 12 种的有关 Spring XML 配置文件的最佳技巧。它们中的一些具有更多的实际意义,而不仅是最好的技巧。请注意另外一些因素,例如域模型的设计,会影响到 XML 配置,但是这篇文章更关注于 XML 配置的可读性和可操控性。
 
1. 避免使用自动装配
Spring 可以通过 bean 类的自省来实现自动装配依赖,这样的话你就不必明确地描述 bean 的属性或者构造函数的参数。根据属性名称活匹配类型, bean 属性可以自动进行装配。而构造函数可以根据匹配类型自动装配。你甚至可以设置自动装配进行自动侦测,这样 Spring 替你就会选择一个合适的机制。请看下面的例子:
 
 
Spring 可以通过 bean 类的自省来实现自动装配依赖,这样的话你就不必明确地描述 bean 的属性或者构造函数的参数。根据属性名称活匹配类型, bean 属性可以自动进行装配。而构造函数可以根据匹配类型自动装配。你甚至可以设置自动装配进行自动侦测,这样 Spring 替你就会选择一个合适的机制。请看下面的例子:
 
    <bean id="orderService"
        class="com.lizjason.spring.OrderService"
        autowire="byName"/>
 
OrderService 类的属性名被用来和容器中的一个 bean 实例进行匹配。自动装配会默默的保存一些类型信息并降低混乱。然而,由于它会牺牲掉这种配置的直观性和可维护性,你在实际的项目中将不会用到它。许多指南和陈述材料都把它吹捧为 Spring 的一个非常 cool 的特性,而没有提到它的这个缺点。依我之见,就像 Spring 的对象池一样,它更多了一些商业味道。它看起来好像可以使 XML 配置文件更精简一些,但实际上却增加其复杂性,尤其是在你的较大规模的工程中已经定义了很多 bean 的时候更是如此。 Spring 允许你混合使用自动和手动装配,但是这种矛盾会使 XML 配置更加的令人费解。
 
2. 使用命名规范
Java 编码的理念一样,在项目中始终用清晰的,描述性的,一致的命名规范对开发人员理解 XML 配置非常有用。拿 bean ID 举例来说,你可以遵循 Java 类中属性的命名规范。比如说, OrderServiceDAO bean 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 配置更加的清晰。当你的配置文件中存在大量的 bean 定义时,它可以显著地提高可读性。
 
4. 尽量使用type 而不是index 去解决构造函数参数的匹配问题
当构造函数中有多个同类型的参数时, Spring 只允许你使用从 0 开始的 index 或者 value 标签来解决这个问题。请看下面的例子:
    <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 可以稍微减少冗余,但是它更容易出错且不如 type 属性可读性高。你应该仅在构造函数中有参数冲突时使用 index
 
5. 如可能,尽量复用bean 定义
Spring 提供了一种类似于继承的机制来降低配置信息的重复并使 XML 配置更加的简单。一个子 bean 可以从它的父 bean 继承配置信息,本质上这个父 bean 就像它的子 bean 的一个模板。这是一个在大型项目中必须使用的特性。所有你要做的就是把父 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 声名一个 class 或工厂方法,这个 bean 将会默认为 abstract
 
6. 尽量使用 ApplicationContext 装配bean,而不是用import
Ant脚本中imports一样, Spring import 元素对于模块化 bean 的装配非常有用,例如:
    <beans>
        <import resource="billingServices.xml"/>
        <import resource="shippingServices.xml"/>
        <bean id="orderService"
            class="com.lizjason.spring.OrderService"/>
    <beans>
然而,比起在XML中用imports预装配这些bean,利用ApplicationContext来配置它们将更加灵活,也可以使XML配置更加的易于管理。你可以像下面这样传递一个bean定义数组到ApplicationContext的构造函数中:
    String[] serviceResources =
        {"orderServices.xml",
        "billingServices.xml",
        "shippingServices.xml"};
ApplicationContext orderServiceContext = new
ClassPathXmlApplicationContext(serviceResources);
 
7. id来标识bean
你可以用id或名字作为bean的标识。用id可读性较差,但是它可以影响XML分析器使beanreference有效。如果id由于XML IDREF约束而无法使用,你可以用name作为bean的标识。XML IDREF约束是指id必须以字母开始(或者是在XML声名了的一个标点符号),后面可以是字母,数字,连字符,下划线,冒号或full stops(不知道怎么翻译好)。在实际应用中很少会遇到XML IDREF约束问题。
 
8. 在开发阶段使用依赖检查
你可以为beandependency-check属性设置一个值来取代默认的none,比如说simpleobjects或者all,这样的话容器将替你做依赖有效性的检查。当一个bean的所有属性(或者某些属性目录)都被明确设置,或利用自动装配时将会非常有用。
    <bean id="orderService"
        class="com.lizjason.spring.OrderService"
        dependency-check="objects">
        <property name="companyName"
            value="lizjason"/>
        <constructor-arg ref="orderDAO"/>
    </bean>
在这个例子中,容器将确保这些属性不是privitives或者保证collections是为orderService bean设置的。为所有的bean设置默认的依赖检查是可能的,但这个特性由于有些bean的属性不需要设置而很少使用。
 
9. 为每个配置文件加一个描述注释
XML配置文件中最好使用有描述性的idname,而不是成堆的注释。另外,加一个文件描述头将会非常有用,这个描述可以概括文件中定义的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 素的一个好处就是工具可以很容易的把描述信息从这个元素中提取出来。
 
10.   team members沟通变更
当你修改java源码后,要确保更改了配置文件中的相应部分并把这个情况告知你的team membersXML配置文件也是代码,它们是程序的重要组成部分,但它们很难阅读和维护。大多数时间里,你需要同时看XML配置文件和java代码才能知道是怎么回事。
 
11.   setter 注入和构造函数注入,优先使用前者
Spring 提供了三种注入方式:构造函数注入,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>
在这个例子中,orderService bean用了构造函数注入,而 BillingService bean 用了setter注入。构造函数注入可以确保bean正确地构建,但是setter注入更加的灵活和易于控制,特别是当class有多个属性并且它们中的一些是可选的情况是更是如此。
 
12.   不要滥用注入
就像前面提到的,Spring ApplicationContextEclipse and IntelliJjava代码更加的易于阅读,维护和管理比使XML文件 可以替你创建 java 对象 但不是所有的 java 对象都应该通过注入创建。例如 域对象就不应该通过 ApplicationContext 创建。Spring是一个优秀的框架,但是考虑到可读性和可操控性,基于XML配置的配置会在定义很多bean的时候出现麻烦。过渡使用依赖注入将会使XML配置更加的复杂和冗长。切记,当使用高效的IDE时,例如
 
结论
XML Spring流行的配置格式。存在大量bean定义时,基于XML的配置会变得冗长而不易使用。Spring提供了丰富的配置选项。适当地使用这些选项可以使XML配置更加的清晰,但其它的一些选项,例如自动装配,可能会降低可读性和可维护性。参考本文中提到的这些技巧可能会帮助你创建干净而易读的XML配置文件。

你可能感兴趣的:(spring)