读书人

Spring 配XML的十二种技能

发布时间: 2012-11-16 14:12:14 作者: rapoo

Spring 配XML的十二种技巧!
? ?? ???<constructor-arg index="1" value="100"/>
? ? </bean>
最好用type属性取代上面的做法:

? ? <bean id="billingService"
? ?? ???value="100"/>
? ? </bean>


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



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

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

? ? <bean id="abstractService" abstract="true"
? ?? ???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元素中加入描述信息。例如:

? ? <beans>
? ?? ???<description>
? ?? ?? ?? ?This file defines billing service
? ?? ?? ?? ?related beans and it depends on
? ?? ?? ?? ?baseServices.xml,which provides
? ?? ?? ?? ?service bean templates...
? ?? ???</description>
? ?? ???...
? ? </beans>
用description元素的一个好处就是工具可以很容易的把描述信息从这个元素中提取出来。



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配置文件

读书人网 >XML SOAP

热点推荐