Spring中XML配置的12个技巧

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

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

  1.避免使用自动装配

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

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

  

      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.使用简化格式

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

  

class="com.lizjason.spring.OrderService">lizjason

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

  class="com.lizjason.spring.OrderService">value="lizjason"/> 简化格式在1.2版本时已经可用了,但请注意不存在这种简化格式不仅可以较少你的代码输入量,而且可以使XML配置更加的清晰。当你的配置文件中存在大量的bean定义时,它可以显著地提高可读性。4.尽量使用type而不是index去解决构造函数参数的匹配问题当构造函数中有多个同类型的参数时,Spring只允许你使用从0开始的index或者value标签来解决这个问题。请看下面的例子:class="com.lizjason.spring.BillingService">

  最好用type属性取代上面的做法: class="com.lizjason.spring.BillingService">value="lizjason"/>

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

  5.如可能,尽量复用bean定义

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

  

      class="com.lizjason.spring.AbstractService">value="lizjason"/>parent="abstractService"class="com.lizjason.spring.ShippingService">

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

     6.尽量使用ApplicationContext装配bean,而不是用import像Ant脚本中imports一样,Spring的import 元素对于模块化bean的装配非常有用,例如:class="com.lizjason.spring.OrderService"/>

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

String[] serviceResources ={"orderServices.xml","billingServices.xml","shippingServices.xml"};

ApplicationContext orderServiceContext = newClassPathXmlApplicationContext(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的所有属性(或者某些属性目录)都被明确设置,或利用自动装配时将会非常有用。class="com.lizjason.spring.OrderService"dependency-check="objects">value="lizjason"/> 在这个例子中,容器将确保这些属性不是privitives或者保证collections是为orderService bean设置的。为所有的bean设置默认的依赖检查是可能的,但这个特性由于有些bean的属性不需要设置而很少使用。

  9.为每个配置文件加一个描述注释

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

  This file defines billing servicerelated beans and it depends onbaseServices.xml,which providesservice bean templates......

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

  10.和team members沟通变更

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

  11.setter注入和构造函数注入,优先使用前者

  Spring提供了三种注入方式:构造函数注入,setter注入和方法注入。一般我们使用前两种。

  

      class="com.lizjason.spring.OrderService">class="com.lizjason.spring.BillingService">ref="billingDAO">

  在这个例子中,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配置文件。

时间: 2024-10-28 04:52:28

Spring中XML配置的12个技巧的相关文章

总结Spring中XML配置的十二个最佳实践

Spring是一个强大的JAVA应用框架,广泛地应用于JAVA的应用程序.为PlainOldJavaObjects(POJOs)提供企业级服务.Spring利用依赖注入机制来简化工作,同时提高易测性.Springbeans及依赖,以及beans类所需的服务都在配置文件中进行了详细的说明,这个配置文件是典型的XML格式.但是它既冗长又不实用.对于需要定义大量Springbeans的大工程来说,我们难以阅读和管理它. 在这篇文章里,对于SpringXML的配置,我将向你展示12种比较好的实践.其中的

Spring 配XML的十二种技巧!

Spring 配XML的十二种技巧! 转帖 :Spring 配XML的十二种技巧! 这篇文章写得不错,希望跟大家一起学习~~ 共同进步!! Spring 配XML的十二种技巧! Spring是一个强有力的java程序框架,其被广泛应用于java的程序中.它用POJO提供了企业级服务.Spring利用依赖注入可以获得简单而有效的测试能力.Spring beans,依赖关系,以及服务所需要的bean都将在配置文件中予以描述,配置文件一般采用XML格式.然而XML配置文件冗长而不易使用,在你进行一个使

java实现Spring在XML配置java类的方法_java

1. 创建自己的bean文件:beans.xml <?xml version="1.0" encoding="UTF-8"?> <busi-beans> <beans> <bean id="SysHelloImpl" type="com.cxm.test.SysHello"> <desc>test</desc> <impl-class>com.

在 Apache Hive 中轻松生存的12个技巧

在 Apache Hive 中轻松生存的12个技巧 Hive 可以让你在 Hadoop 上使用 SQL,但是在分布式系统上优化 SQL 则有所不同.这里是让你可以轻松驾驭 Hive 的12个技巧. Hive 并不是关系型数据库(RDBMS),但是它大多数时候都表现得像是一个关系型数据库一样,它有表.可以运行 SQL.也支持 JDBC 和 ODBC. 这种表现既有好的一面,也有不好的一面:Hive 并不像关系型数据库那样执行 SQL 查询.我在 Hive 上花费了大量时间,光是我自己在工作中就为了

Spring中如何配置DataSource数据源

在Spring框架中有如下3种获得DataSource对象的方法: 1.从JNDI获得DataSource. 2.从第三方的连接池获得DataSource. 3.使用DriverManagerDataSource获得DataSource. 一.从JNDI获得DataSource SpringJNDI数据源配置信息: <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean&qu

探讨fckeditor在Php中的配置详解_php技巧

前言: FCKeidtor是个国外的多语言编辑器,你可以对其配置文件进行简单修改使之支持目前常用Web开发语言的应用,下面我就讲讲FCKeditor的最新版本2.4.2在php的具体配置过程,有不足和出错的地方,欢迎指正. 精简: 正因为这个编辑器是支持多语言的,所以首先我们针对使用对其做相应的冗余文件删除. 1.临时文件及文件夹删除:从根目录下开始删除一切以"_"开头的文件及文件夹,因为他们为临时文件和文件夹.删除这类临时文件及文件夹之后,我们还要删除一些根目录下的多余文件,根目录下

spring mvc xml配置拦截器

spring mvc 有两种配置:(1)注解:(2)基于xml(schema). 公司要求使用xml方式的,其实在我看来注解更方便: 如何使用xml配置spring mvc的拦截器呢? 场景:比如用户通过浏览器访问我的网站时,我需要判断用户是否已经登录过,若登录过,则允许访问,否则自动跳转到登陆页面. spring mvc中拦截器类需要继承HandlerInterceptorAdapter 类 代码如下: Java代码   package com.yj.mvc.controler.interce

spring中bean配置和bean注入

1 bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序进行调用. 1 bean配置 bean配置有三种方法: 基于xml配置Bean 使用注解定义Bean 基于java类提供Bean定义信息 1.1 基于xml配置Bean  对于基于XML的配置,

MyBatis延迟加载及在spring中集成配置

 当你要使用one to one,many to one 就会碰到N+1的问题.很明显,对象之间关联很多有A关联B,B关联C,C关联A这样的关系,如果不是采用延迟加载,很容易一下在出现成千上万对象,造成N+1的问题.   而Mybatis 设置延迟加载主要2个属性配置: <?xml version="1.0" encoding="UTF-8"?>     <!DOCTYPE configuration        PUBLIC "-