`

Spring XML配置十二个最佳实践(转)

阅读更多
Spring是一个强大的JAVA应用框架,广泛地应用于JAVA的应用程序。为Plain Old Java Objects(POJOs)提供企业级服务。Spring利用依赖注入机制来简化工作,同时提高易测性。Spring beans及依赖,以及beans类所需的服务都在配置文件中进行了详细的说明,这个配置文件是典型的XML格式。但是它既冗长又不实用。对于需要定义大量Spring beans的大工程来说,我们难以阅读和管理它。

版权声明:任何获得Matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:Jason;Li;evenbetter(作者的blog:
http://blog.matrix.org.cn/page/evenbetter)
原文:http://www.onjava.com/pub/a/onjava/2006/01/25/spring-xml-configuration-best-practices.html
译文:http://www.matrix.org.cn/resource/article/44/44236_Spring+XML+Configurations.html
关键字:Spring;XML;Configurations

在这篇文章里,对于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 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>

相对于使用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 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 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(公司)一名资深的软件工程师。
分享到:
评论

相关推荐

    Spring XML配置十二个最佳实践

    Spring XML配置十二个最佳实践

    websevice,spring,cxg,ibatis

    CXF环境配置 - jackymin CXF与Spring的集成 log4j的配置使用 Spring XML配置十二个最佳实践WebService开发实例 (Xfire+Spring+Hibernate)

    spring-boot-best-practices-sample:Spring Boot 2.x最佳实践样本

    Spring团队意识到这个问题后,为了摆脱繁琐的XML配置,就推出了Spring Boot. Spring Boot 使用自动配置技术,可以做到零配置XML文件,当然如果想用XML配置Bean,Spring Boot 也保持了兼容。 Spring Boot 无疑如今已经...

    精通spring--源代码

    包括忘却的Spring高级话题,Spring最佳实践  对Spring2.5内置的各种XML Schema支持进行了全方位阐述。包括基于XML Schema的权威配置指南  全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本...

    精通Spring(书签)

    包括忘却的Spring高级话题,Spring最佳实践  对Spring2.5内置的各种XML Schema支持进行了全方位阐述。包括基于XML Schema的权威配置指南  全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本...

    spring.net中文手册在线版

    16.1.2. XML配置 16.1.3.管理连接字符串 第十七章. 使用ADO.NET进行数据访问 17.1.简介 17.2.动机 17.3.Provider抽象 17.3.1.创建IDbProvider类型的实例 17.4.命名空间 17.5.数据访问的方式 17.6.AdoTemplate简介 ...

    精通Spring(书签版)

    包括忘却的Spring高级话题,Spring最佳实践  对Spring2.5内置的各种XML Schema支持进行了全方位阐述。包括基于XML Schema的权威配置指南  全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本...

    精通Spring (书签版)

    包括忘却的Spring高级话题,Spring最佳实践  对Spring2.5内置的各种XML Schema支持进行了全方位阐述。包括基于XML Schema的权威配置指南  全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本...

    enterprise-spring-best-practices:企业Spring最佳实践

    企业Spring最佳实践 博客系列“ Enterprise Spring最佳...02 Spring XML配置 引导程序配置文件 SLF4J和Logback配置 Apache Commons(又名Jakarta Commons / JCL) Java Util(又名JUL) System.out和System.err 资源

    一个基于Spring Boot & MyBatis的种子项目,用于快速构建中小型API、RESTful API项目~

    最佳实践的项目结构、配置文件、精简的POM(查看项目结构图) 统一响应结果及生成工具 统一异常处理 简单的接口签名认证 使用基础方法抽象封装 使用Druid Spring Boot Starter集成Druid数据库连接池与监控 使用...

    wsdl2java源码-spring-boot-cxf-integration-noxml:SpringBoot和CXF集成,无需xml配置

    服务正常工作所需的最少部分,因此我们尝试使其尽可能简单,但遵循最佳实践。 创建 Web 服务的步骤 创建 XSD 文件 考虑 Web 服务将接收和发送回的数据并设计 xsd 文件。 我发现将一个 xsd 用于“输入”参数,一个...

    SpringMVC-SpringSecurity-MySql-Hibernate

    将Dispatcher Servlet与web.xml一起设置的最佳实践。 配置Spring Security并创建经过身份验证的页面,例如“登录”页面和“管理页面” 。 用于在具有授权角色的数据库上创建安全用户的安全上下文集成。 (本教程...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    BlazeDS 将读取 services-config.xml 配置文件,该配置文件又引用了 remoting-config.xml、proxy-config.xml 和 messaging-config.xml 这 3 个配置文件,所以,一共需要 4 个配置文件。 由于 BlazeDS 需要将 Java ...

    jaxrs-sample:用于最佳 REST 实践的基于 REST JAX-RS CXF 的示例脚手架

    REST JAX-RS CXF Spring 最佳实践模板。 描述 从非持久内存数据存储中添加、检索和删除存储的示例应用程序。 PUT - 使用客户端提供的 ID 添加或更新存储 GET - 获取商店 DELETE - 删除存储 特征 多模块maven项目 ...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    BlazeDS 将读取 services-config.xml 配置文件,该配置文件又引用了 remoting-config.xml、proxy-config.xml 和 messaging-config.xml 这 3 个配置文件,所以,一共需要 4 个配置文件。 由于 BlazeDS 需要将 Java ...

    Spring Boot & MyBatis种子项目,用于快速构建中小型API、RESTful API项目

    - 最佳实践的项目结构、配置文件、精简的POM([查看项目结构图] - 统一响应结果封装及生成工具 - 统一异常处理 - 简单的接口签名认证 - 常用基础方法抽象封装 - 使用Druid Spring Boot Starter 集成Druid数据库连接...

    基于springboot的网上购物商城系统研发.zip

    "基于springboot的网上购物商城系统研发.zip"是一个针对开发网上购物商城系统的项目压缩包。该项目使用Spring Boot框架,这是一...同时,它也适合用作教学材料,帮助学生或初学者了解现代Web应用的开发流程和最佳实践。

    Mybatis.PDF

    在不同方面的应用以及在使用过程中的最佳实践方案。针对 MyBatis 高级映射、存储过程和类型处理器提 供了丰富的示例,通过自下而上的方法使读者更好地理解和掌握 MyBatis 的高级用法,同时针对 MyBatis 的代码生成...

    MyBatis 从入门到精通

    通过全面的示例代码和测试讲解了在 MyBatis XML 方式和注解方式中进行增、删、改、查操作的基本用法,介绍了动态 SQL 在不同方面的应用以及在使用过程中的最佳实践方案。针对 MyBatis 高级映射、存储过程和类型...

    《MyBatis 从入门到精通》源代码

    通过全面的示例代码和测试讲解了在 MyBatis XML 方式和注解方式中进行增、删、改、查操作的基本用法,介绍了动态 SQL 在不同方面的应用以及在使用过程中的最佳实践方案。针对 MyBatis 高级映射、存储过程和类型...

Global site tag (gtag.js) - Google Analytics