论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> JAVA认证 >> IT正文
Spring XML配置十二个最佳实践
 作者:佚名     2007-3-14 17:30:42        来源:不详  浏览次数:

 

 

 

 

 

 

 

 

     在这篇文章里,对于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类名来命名它。对于例子中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配置文件清晰。它最引人注目的是当在一个配置文件中有大量定义的类时可以提高易读性。

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
            value="lizjason"/>
        <CONSTRUCTOR-ARG value="100" type="int" />
    </BEAN>


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

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

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



ShippingService类从abstractService类那里继承companyName属性的值——lizjason。如果你没有为一个bean指明类或factory方法,那么这个bean便是抽象的。

6. 尽量使用ApplicationContext来装配定义的bean

像在Ant脚本中的引用一样,Spring的引用对于装配模块化的bean来说是很有用的。例如:
    <BEANS>
        
        
        <BEAN id=orderService
            class="com.lizjason.spring.OrderService"/>
    <BEANS>


相对于使用import在XML配置中来预装配,通过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 parser对bean的引用有效方面进行更好的验证。如果由于XML IDREF的限制而不能使用某个id,你可以利用names来作为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设置的属性不是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 o­n
            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 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(公司)一名资深的软件工程师。 </property></property></property></property>


责任编辑:lss
  相关新闻
Spring MVC framework总体分析
Spring MVC framework总体分析
2005年9月全国计算机等级考试二级Visual FoxPro笔试试
Spring VS. HiveMind
Spring开发基础之Spring事务管理
Jsp中的Application使用
Visual FoxPro 中的错误处理
快速上手Spring--4.安装和使用IDE
思科认证心得:OSPF经验总结
快速上手Spring--5.Bean的标志符
2005年9月全国计算机等级考试二级Visual FoxPro笔试试
CISCO最新CCSP认证介绍
思科认证心得:OSPF经验总结
微软新推Dynamics社区 打造Myspace商务版
快速上手Spring--5.Bean的标志符
快速上手Spring--4.安装和使用IDE
快速上手Spring--6.Singleton的使用
快速上手Spring--10.任意方法的替换
快速上手Spring--9.Lookup方法注入
快速上手Spring--8.集合对象注入
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号