`
dong_java
  • 浏览: 42141 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Spring 中XML文件配置的12个技巧

阅读更多
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分析器使bean的reference有效。如果id由于XML IDREF约束而无法使用,你可以用name作为bean的标识。XML IDREF约束是指id必须以字母开始(或者是在XML声名了的一个标点符号),后面可以是字母,数字,连字符,下划线,冒号或full stops(不知道怎么翻译好)。在实际应用中很少会遇到XML IDREF约束问题。


8. 在开发阶段使用依赖检查

你 可以为bean的dependency-check属性设置一个值来取代默认的none,比如说simple,objects或者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配置文件中最好使用有描述性的id和name,而不是成堆的注释。另外,加一个文件描述头将会非常有用,这个描述可以概括文件中定义的bean。另一个选择,你可以在description元素中加入描述信息。例如:


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

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

10. 和team members沟通变更

当你修改java源码后,要确保更改了配置文件中的相应部分并把这个情况告知你的team members。XML配置文件也是代码,它们是程序的重要组成部分,但它们很难阅读和维护。大多数时间里,你需要同时看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的ApplicationContext可以替你创建java对象,但不是所有的java对象都应该通过注入创建。例如,域 对象就不应该通过ApplicationContext创建。Spring是一个优秀的框架,但是考虑到可读性和可操控性,基于XML配置的配置会在定义 很多bean的时候出现麻烦。过渡使用依赖注入将会使XML配置更加的复杂和冗长。切记,当使用高效的IDE时,例如Eclipse and IntelliJ,java代码更加的易于阅读,维护和管理比使XML文件


结论

XML 是Spring流行的配置格式。存在大量bean定义时,基于XML的配置会变得冗长而不易使用。Spring提供了丰富的配置选项。适当地使用这 些选项可以使XML配置更加的清晰,但其它的一些选项,例如自动装配,可能会降低可读性和可维护性。参考本文中提到的这些技巧可能会帮助你创建干净而易读 的XML配置文件
分享到:
评论

相关推荐

    Spring中XML配置的12个技巧

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

    Spring XML配置的12个技巧

    Spring beans,依赖关系,以及服务所需要的bean都将在配置文件中予以描述,配置文件一般采用XML格式。 然而XML配置文件冗长而不易使用,在你进行一个使用了大量bean的大项目中它将变得难以阅读和控制。

    spring.net中文手册在线版

    Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为...

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

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

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

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

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

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

    Hibernate使用技巧汇总

    两种配置文件: A.hibernate.cfg.xml 和 B.hibernate.properties A中可含映射文件的配置,而B中hard codes加映射文件。 A。Configuration config=new Configuration().config(); B. ...

    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 ...

    好用的代码生成源码

    充分利用各种文件的注释 如在.xml中我们可以使用 在.properties文件中我们可以使用 #generator-insert-location 具体请查看template/insert_demo目录的内容 生成器参数配置 通过设置GeneratorProperties.set...

    彻底解决hibernate常见难点.zip

    N关系时保存技巧、Hibernate缓存机制、Hibernate批量处理数据、Hibernate三种继承映射策略、hibernate映射体系、Hibernate主键生成策略、持久层DAO设计建议、基于xml文件的bean、使用HibernateAPI在Spring中、事务...

    JAVA上百实例源码以及开源项目

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    数据库乱码的小技巧

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

    asp.net知识库

    从SQL中的一个表中导出HTML文件表格 获取數据库表的前N条记录 几段SQL Server语句和存储过程 生成表中的数据的脚本 最详细的SQL注入相关的命令整理 Oracle Oracle中PL/SQL单行函数和组函数详解 mssql+oracle Oracle...

    iBATIS实战

    10.3 配置技巧 183 10.3.1 多个服务器 183 10.3.2 多种数据库方言 184 10.3.3 运行时配置更改 185 10.4 基于SQL Map的DAO实现示例 185 10.4.1 配置iBATIS DAO 186 10.4.2 创建DaoManager实例 187 10.4.3 定义事务...

    JAVA上百实例源码以及开源项目源代码

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    8.8.2 struts.xml文件配置出错 8.9 精彩回顾 第9章 庖丁解牛 ——揭密Struts2高级技术 9.1 本章学习任务 9.1.1 本章知识体系 9.1.2 实例开发任务 9.2 OGNL表达式语言 9.2.1 认识OGNL 9.2.2 Struts2框架中的OGNL ...

    基于SSM的健身房管理系统(源码+部署说明+演示视频+源码介绍).zip

    本资源是一个基于SSM(Spring、SpringMVC、MyBatis)的健身房管理系统。它包含了完整的源代码、部署说明、演示视频以及源码介绍,旨在帮助开发者快速搭建一个功能完善、易于维护的健身房管理系统。源码介绍:本系统...

    达内java培训目录

    Spring技术 Spring Ioc基础、Ioc注入技巧、对象高级装配(自动装配、模板装配、组件扫描特性、FactoryBean、对象生命周期)、Spring AOP原理、AspectJ、Spring JDBC支持、Spring事务及安全管理;Spring整合Hibernate...

Global site tag (gtag.js) - Google Analytics