`
kang275284
  • 浏览: 163457 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring XML配置的12个技巧

阅读更多

Spring是一个强有力的java程序框架,其被广泛应用于java的程序中。它用POJO提供了企业级服务。Spring利用依赖注入可以获得简单而有效的测试能力。Spring beans,依赖关系,以及服务所需要的bean都将在配置文件中予以描述,配置文件一般采用XML格式。然而XML配置文件冗长而不易使用,在你进行一个使用了大量bean的大项目中它将变得难以阅读和控制。

<o:p> </o:p>

在这篇文章中我将给你展示12种的有关Spring XML配置文件的最佳技巧。它们中的一些具有更多的实际意义,而不仅是最好的技巧。请注意另外一些因素,例如域模型的设计,会影响到XML配置,但是这篇文章更关注于XML配置的可读性和可操控性。

<o:p> </o:p>

1. 避免使用自动装配<o:p></o:p>

Spring可以通过bean类的自省来实现自动装配依赖,这样的话你就不必明确地描述bean的属性或者构造函数的参数。根据属性名称活匹配类型,bean属性可以自动进行装配。而构造函数可以根据匹配类型自动装配。你甚至可以设置自动装配进行自动侦测,这样Spring替你就会选择一个合适的机制。请看下面的例子:

<o:p> </o:p>

<o:p> </o:p>

Spring可以通过bean类的自省来实现自动装配依赖,这样的话你就不必明确地描述bean的属性或者构造函数的参数。根据属性名称活匹配类型,bean属性可以自动进行装配。而构造函数可以根据匹配类型自动装配。你甚至可以设置自动装配进行自动侦测,这样Spring替你就会选择一个合适的机制。请看下面的例子:

<o:p> </o:p>

    <bean id="orderService"<o:p></o:p>

        class="com.lizjason.spring.OrderService"<o:p></o:p>

        autowire="byName"/><o:p></o:p>

<o:p> </o:p>

OrderService类的属性名被用来和容器中的一个bean实例进行匹配。自动装配会默默的保存一些类型信息并降低混乱。然而,由于它会牺牲掉这种配置的直观性和可维护性,你在实际的项目中将不会用到它。许多指南和陈述材料都把它吹捧为Spring的一个非常cool的特性,而没有提到它的这个缺点。依我之见,就像Spring的对象池一样,它更多了一些商业味道。它看起来好像可以使XML配置文件更精简一些,但实际上却增加其复杂性,尤其是在你的较大规模的工程中已经定义了很多bean的时候更是如此。Spring允许你混合使用自动和手动装配,但是这种矛盾会使XML配置更加的令人费解。

<o:p> </o:p>

2. 使用命名规范<o:p></o:p>

Java编码的理念一样,在项目中始终用清晰的,描述性的,一致的命名规范对开发人员理解XML配置非常有用。拿bean ID举例来说,你可以遵循Java类中属性的命名规范。比如说,OrderServiceDAObean ID应该是orderServiceDAO。对于大项目来说,在bean ID前加包名来作为前缀。

<o:p> </o:p>

3. 使用简化格式<o:p></o:p>

简化格式有利于减少冗余,因为它把属性值和引用作为属性,而不是子元素。看下面的例子:

    <bean id="orderService"<o:p></o:p>
        class="com.lizjason.spring.OrderService"><o:p></o:p>
        <property name="companyName"><o:p></o:p>
            <value>lizjason</value><o:p></o:p>
        </property><o:p></o:p>
        <constructor-arg><o:p></o:p>
            <ref bean="orderDAO"><o:p></o:p>
        </constructor-arg><o:p></o:p>
    </bean><o:p></o:p>

以上程序可以重新以简化格式书写为:

    <bean id="orderService"<o:p></o:p>
        class="com.lizjason.spring.OrderService"><o:p></o:p>
        <property name="companyName"<o:p></o:p>
            value="lizjason"/><o:p></o:p>
        <constructor-arg ref="orderDAO"/><o:p></o:p>
    </bean><o:p></o:p>

简化格式在1.2版本时已经可用了,但请注意不存在<ref local="...">这种简化格式不仅可以较少你的代码输入量,而且可以使XML配置更加的清晰。当你的配置文件中存在大量的bean定义时,它可以显著地提高可读性。

<o:p> </o:p>

4. 尽量使用type而不是index去解决构造函数参数的匹配问题<o:p></o:p>

当构造函数中有多个同类型的参数时,Spring只允许你使用从0开始的index或者value标签来解决这个问题。请看下面的例子:

    <bean id="billingService"<o:p></o:p>
        class="com.lizjason.spring.BillingService"><o:p></o:p>
        <constructor-arg index="0" value="lizjason"/><o:p></o:p>
        <constructor-arg index="1" value="100"/><o:p></o:p>
    </bean><o:p></o:p>

最好用type属性取代上面的做法:

    <bean id="billingService"<o:p></o:p>
        class="com.lizjason.spring.BillingService"><o:p></o:p>
        <constructor-arg type="java.lang.String"<o:p></o:p>
            value="lizjason"/><o:p></o:p>
        <constructor-arg type="int" value="100"/><o:p></o:p>
    </bean><o:p></o:p>

<o:p> </o:p>

index可以稍微减少冗余,但是它更容易出错且不如type属性可读性高。你应该仅在构造函数中有参数冲突时使用index

<o:p> </o:p>

5. 如可能,尽量复用bean定义<o:p></o:p>

Spring提供了一种类似于继承的机制来降低配置信息的重复并使XML配置更加的简单。一个子bean可以从它的父bean继承配置信息,本质上这个父bean就像它的子bean的一个模板。这是一个在大型项目中必须使用的特性。所有你要做的就是把父beanabstract属性置为true,并在子bean中加以引用。例如:

    <bean id="abstractService" abstract="true"<o:p></o:p>
        class="com.lizjason.spring.AbstractService"><o:p></o:p>
        <property name="companyName"<o:p></o:p>
            value="lizjason"/><o:p></o:p>
    </bean><o:p></o:p>
<o:p> </o:p>
    <bean id="shippingService"<o:p></o:p>
        parent="abstractService"<o:p></o:p>
        class="com.lizjason.spring.ShippingService"><o:p></o:p>
        <property name="shippedBy" value="lizjason"/><o:p></o:p>
    </bean><o:p></o:p>

shippingService bean继承了abstractService bean的属性companyName的值lizjason。注意,如果你为bean声名一个class或工厂方法,这个bean将会默认为abstract

<o:p> </o:p>

6. 尽量使用ApplicationContext装配bean,而不是用import<o:p></o:p>

Ant脚本中imports一样,Springimport 元素对于模块化bean的装配非常有用,例如:<o:p></o:p>

    <beans><o:p></o:p>
        <import resource="billingServices.xml"/><o:p></o:p>
        <import resource="shippingServices.xml"/><o:p></o:p>
        <bean id="orderService"<o:p></o:p>
            class="com.lizjason.spring.OrderService"/><o:p></o:p>
    <beans><o:p></o:p>

然而,比起在XML中用imports预装配这些bean,利用ApplicationContext来配置它们将更加灵活,也可以使XML配置更加的易于管理。你可以像下面这样传递一个bean定义数组到ApplicationContext的构造函数中:<o:p></o:p>

    String[] serviceResources =<o:p></o:p>

        {"orderServices.xml",<o:p></o:p>

        "billingServices.xml",<o:p></o:p>

        "shippingServices.xml"};<o:p></o:p>

ApplicationContext orderServiceContext = new<o:p></o:p>

ClassPathXmlApplicationContext(serviceResources);<o:p></o:p>

<o:p> </o:p>

7. id来标识bean<o:p></o:p>

你可以用id或名字作为bean的标识。用id可读性较差,但是它可以影响XML分析器使beanreference有效。如果id由于XML IDREF约束而无法使用,你可以用name作为bean的标识。XML IDREF约束是指id必须以字母开始(或者是在XML声名了的一个标点符号),后面可以是字母,数字,连字符,下划线,冒号或full stops(不知道怎么翻译好)。在实际应用中很少会遇到XML IDREF约束问题。<o:p></o:p>

<o:p> </o:p>

8. 在开发阶段使用依赖检查<o:p></o:p>

你可以为beandependency-check属性设置一个值来取代默认的none,比如说simpleobjects或者all,这样的话容器将替你做依赖有效性的检查。当一个bean的所有属性(或者某些属性目录)都被明确设置,或利用自动装配时将会非常有用。<o:p></o:p>

    <bean id="orderService"<o:p></o:p>
        class="com.lizjason.spring.OrderService"<o:p></o:p>
        dependency-check="objects"><o:p></o:p>
        <property name="companyName"<o:p></o:p>
            value="lizjason"/><o:p></o:p>
        <constructor-arg ref="orderDAO"/><o:p></o:p>
    </bean><o:p></o:p>

在这个例子中,容器将确保这些属性不是privitives或者保证collections是为orderService bean设置的。为所有的bean设置默认的依赖检查是可能的,但这个特性由于有些bean的属性不需要设置而很少使用。<o:p></o:p>

<o:p> </o:p>

9. 为每个配置文件加一个描述注释<o:p></o:p>

XML配置文件中最好使用有描述性的idname,而不是成堆的注释。另外,加一个文件描述头将会非常有用,这个描述可以概括文件中定义的bean。另一个选择,你可以在description元素中加入描述信息。例如:<o:p></o:p>

    <beans><o:p></o:p>
        <description><o:p></o:p>
            This file defines billing service<o:p></o:p>
            related beans and it depends on<o:p></o:p>
            baseServices.xml,which provides<o:p></o:p>
            service bean templates...<o:p></o:p>
        </description><o:p></o:p>
        ...<o:p></o:p>
    </beans><o:p></o:p>

description素的一个好处就是工具可以很容易的把描述信息从这个元素中提取出来。<o:p></o:p>

<o:p> </o:p>

10.   team members沟通变更<o:p></o:p>

当你修改java源码后,要确保更改了配置文件中的相应部分并把这个情况告知你的team membersXML配置文件也是代码,它们是程序的重要组成部分,但它们很难阅读和维护。大多数时间里,你需要同时看XML配置文件和java代码才能知道是怎么回事。<o:p></o:p>

<o:p> </o:p>

分享到:
评论

相关推荐

    spring xml配置的12個技巧

    spring xml配置的12個技巧 spring xml配置的12個技巧 spring xml配置的12個技巧

    Spring中XML配置的12个技巧

    在这篇文章中我将给你展示12种的有关Spring XML配置文件的最佳技巧。请注意另外一些因素,例如域模型的设计,会影响到XML配置,但是这篇文章更关注于XML配置的可读性和可操控性。

    Spring ApplicationContext.xml配置的12个技巧演示教学.pdf

    Spring ApplicationContext.xml配置的12个技巧演示教学.pdf

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    前几天搞 Spring + Hibernate + Struts 事务配置 ,网上找了好多资料,不过好无语,大多都是 Ctrl + V,浪费俺的宝贵时间 现在我总结配出一套,给大家参考参考,可能有不足,请大家多多交流。 附:内有弹出...

    spring boot 初学者实战总结.zip

    ### Spring Boot 初学者实战总结 #### 概述 Spring Boot 是一个基于 Spring 框架的... - **自动配置**:Spring Boot 提供了多种自动配置功能,减少了繁琐的 XML 配置,使项目开发更简洁高效。 - **应用配置文件**

    精通spring--源代码

    精通spring 源代码 对JavaEE5及Spring2.5进行了综述。包括Java EE5,步入Spring2.5,获得... 全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本和高级使用技巧,从而提高本书的参考和阅读价值

    精通Spring(书签)

    专业人士,权威经典。  Spring 2.5是迄今为止完美的Java EE架构级框架,全面深入、多维度... 全书理论与实践并重,通过大量的实例帮助读者尽快掌握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 2.5是迄今为止完美的... 全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本和高级使用技巧,从而提高本书的参考和阅读价值 请大家查阅我的资源,共分为三部分。

    精通Spring(书签版)

    专业人士,权威经典。  Spring 2.5是迄今为止完美的Java EE架构级框架,全面深入、多维度... 全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本和高级使用技巧,从而提高本书的参考和阅读价值

    Spring实战之使用XML方式管理声明式事务操作示例

    主要介绍了Spring实战之使用XML方式管理声明式事务操作,结合实例形式详细分析了Spring XML方式管理声明式事务具体步骤、配置、接口及使用技巧,需要的朋友可以参考下

    Hibernate使用技巧汇总

    HibernateTemplate对Hibernate Session操作进行了封装,而 HibernateTemplate.execute方法则是一封装机制的核心 *在spring的配置文件里,移植了整个hibernate.cfg.xml的内容。

    ssh2(struts2+spring2.5+hibernate3.3)自动生成模版

    generator\template\src\conf\${subpackage}\目录下有8个xml文件,4个配置文件中是带有xml文件头信息的,4个配置文件不带头文件信息,也就是说这4个文件是标准的配置文件,还有4个是非标准的(文件名中带有-insert的)。...

    基于SSM框架的精品课程网站源码实现

    - 配置文件(XML: 11个) - Markdown文档(10个) - 地图文件(4个) 项目特点:该项目结构清晰简洁,使用的技术栈经典且成熟,非常适合Java初学者作为项目入门实践,同时也适合有志于深入企业级Java开发的学习者...

    基于SSM框架的CRUD操作实战源码学习与总结

    - XML文件:9个,主要用于配置SSM框架和数据库相关设置。 - JavaScript文件:7个,实现动态交互和数据操作。 - CSS文件:4个,负责页面样式设计和美化。 - Map文件:4个,可能与前端资源的路径映射有关。 - JSP文件...

    Maven权威指南 很精典的学习教程,比ANT更好用

    12. Maven Assemblies 12.1. Introduction 12.2. Assembly Basics 12.2.1. Predefined Assembly Descriptors 12.2.2. Building an Assembly 12.2.3. Assemblies as Dependencies 12.2.4. Assembling ...

    数据库乱码的小技巧

    老是出现中文乱码,根据网上的各种策略,使用spring自带的字符过滤器啊,设置页面编码啊,设置数据库编码啊都设置好为UTF-8了,还是出现中问乱码,后来在spring的配置文件applicationContext.xml中的配置数据源中的...

Global site tag (gtag.js) - Google Analytics