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配置文件
分享到:
相关推荐
8. 使用`<import>`引入其他配置:当配置文件变得庞大时,可以将相关bean分组到单独的XML文件中,然后使用`<import>`标签导入这些文件,保持配置结构清晰。 9. 利用`<alias>`创建别名:为bean创建别名可以提供多个...
### Spring中XML配置的12个技巧 #### 1. 避免使用自动装配 在Spring框架中,自动装配(auto-wiring)是一种强大的功能,它允许开发者通过元数据(如bean类的自省)自动装配bean之间的依赖关系,从而避免在XML配置...
"Spring ApplicationContext.xml配置的12个技巧演示教学" Spring ApplicationContext.xml配置是 Spring 框架中非常重要的一部分,它提供了企业级服务,并且可以通过依赖注入来获得简单而有效的测试能力。然而,在...
例如,在一个名为 `rootConfig.xml` 的主配置文件中,可以这样导入其他配置文件: ```xml <import resource="services.xml"/> <import resource="resources/messageSource.xml"/> ...
"Spring+mvc+mybatis Mapper xml自动加载"这个主题聚焦于如何在开发过程中优化配置,使得改动Mapper XML文件后,无需重启Tomcat服务器,就可以立即生效,从而提高开发效率。 Spring MVC是Spring框架的一部分,它...
Spring通过解析XML文件中的`<bean>`标签来创建和管理对象,但有时候,`<bean>`标签不能满足所有复杂场景的需求。这时,自定义XML标签就派上用场了。例如,在描述分布式服务框架Dubbo的配置时,`<dubbo:service>`标签...
在探讨Spring配XML的十二种技巧时,我们深入解析了几个关键点,这些技巧旨在提升Spring框架中XML配置文件的可读性、可维护性和效率。以下是对文章中提到的几点技巧的详细解读: ### 1. 避免使用自动装配 尽管...
在Spring框架中,XML配置文件是定义和管理bean的主要方式之一。`class`属性在`<bean>`标签中起着至关重要的作用,因为它指定要实例化的Java类全路径。为了解决在编写XML配置时手动输入类全路径的不便,开发工具通常...
Spring的ApplicationContext.xml配置是Spring框架的核心部分,用于定义和管理应用程序中的bean及其依赖关系。本文将探讨12个提升配置效率和可维护性的技巧。 1. **避免过度使用自动装配**(Autowiring):虽然...
在Spring XML配置文件中,我们通过`<bean>`标签定义一个bean。例如: ```xml <!-- 初始化参数 --> 张三"/> ``` 这里,`id`是bean的唯一标识符,`class`指定bean的实现类,`property`标签用于设置bean属性的值。 ...
在Eclipse这样的集成开发环境中,配置XML文件的自动提示功能可以极大地提高开发效率。 Spring框架2.5的XML配置文件通常用于定义bean的实例化、依赖注入、AOP代理等。通过引入相应的DTD文件,Eclipse可以提供自动...
在解析XML文件时,我们需要实现一个XML解析器,如SAX或DOM解析器,来读取bean的定义。对于每个`<bean>`标签,我们需要收集id、class属性以及任何`<property>`或`<constructor-arg>`标签。 解析完成后,我们需要创建...
### Spring整合配置文件详解 #### 一、Spring框架概述 Spring框架是一个开源的Java平台,提供了全面的...通过这些内容的学习,可以帮助开发者更好地理解和掌握Spring框架的配置技巧,从而提高开发效率和代码质量。
### Spring配置文件详解 #### 一、引言 在Java Web开发领域中,Spring框架以其强大的功能和灵活性占据了...掌握这些配置技巧对于理解和应用Spring框架具有重要意义,能够帮助开发者更加高效地完成项目开发工作。
一个典型的 Spring 2.5 配置文件至少会包含以下结构: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
通过分析xml文件头实例,我们可以了解Spring标准的xml文件头的结构和组成部分,并掌握xml文件头的配置技巧。 一、xml文件头的基本结构 xml文件头是xml文件的开头部分,用于定义xml文件的基本信息。xml文件头的基本...
首先,集成MyBatis到Spring项目中,你需要在项目的pom.xml文件中添加MyBatis和Spring的相关依赖。确保引入了mybatis-spring、mybatis、spring-jdbc和spring-context等库,这些库提供了MyBatis与Spring集成所需的核心...