posts - 40,  comments - 4,  trackbacks - 0
    Spring 是一个强大的JAVA应用框架,广泛地应用于JAVA的应用程序。为Plain Old Java ObjectsPOJOs)提供企业级服务。Spring利用从属注入机制来简化工作,同时提高易测性。Spring beans及其附属和类所需的服务在配置文件中得到了详细的说明,这个配置文件具有典型的XML格式。但是它既冗长又不实用。对于需要定义大量Spring beans的大工程来说,我们难以阅读和管理它。

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

1.不要使用自动绑定

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

< bean id = " orderService "

        
class = " com.lizjason.spring.OrderService "

        autowire
= " byName " />

    OrderService

类的属性名在容器中用于匹配bean实例。自动绑定可以潜在地节省一些打字和减少一些混乱。但是在现实世界的工程里你不应该使用这种方式,这是因为它牺牲了配置的清晰性和可维护性。许多指南和介绍中大量吹捧自动绑定是Spring的一种极好的特征而没有提到这一特性所带来的牺牲。依我的观点,这就像Spring中的objectpooling,它更像是一种 商业特征 。它对于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>

can be rewritten in the shortcut form as:

可以使用简洁形式将上述代码重写为:

    <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 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中给从属检测的属性设置值,而不采用原先默认的空值,属性设置例如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设置的属性不是原始的 。它可能为所有的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时,例如EclipseIntelliJ,与XML文件相比,Java代码更加易读,易维护,易管理。

 

总结

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

关于作者:

Jason Zhicheng Li Object Computing, Inc. in St. Louis, MO(公司)一名资深的软件工程师。


posted on 2007-02-25 17:33 larryjava 阅读(116) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: