当前位置:文档之家› Spring的XML配置文件的十二个最佳方法实践

Spring的XML配置文件的十二个最佳方法实践

spring是一个强大的Java应用框架,它广泛地应用于Java应用程序中,为Plain Old Java Objects(POJO)提供企业级服务。

Spring利用依赖注入机制来简化工作,同时提高可测试性。

其配置文件(通常是XML格式)中指定了 Spring bean、依赖性以及bean所需的服务。

但是,这些XML配置文件既冗长又不实用。

对于需要定义大量Spring bean的大型项目来说,它们难以阅读和管理。

在本文中,我将向您展示12种用于Spring XML配置的最佳实践。

其中的一些实践与其说是最佳实践,倒不如说是必要实践。

注意,其他因素(如域模型的设置)也可能影响XML的配置,但是本文重点研究XML配置的可读性和可管理性。

1。

避免使用自动绑定(autowiring)功能Spring 可以通过bean类的自省自动绑定依赖性,所以不必显式指明bean的属性和构造函数。

Bean属性可以通过属性名称或类型匹配来实现自动绑定。

构造函数通过类型匹配来实现自动绑定。

甚至可以指定自动检测autowiring模式,它可以引导Spring选择一种适当的运行机制。

先来看看下面的一个例子:Java代码1.<bean id="orderService"2. class="com.lizjason.spring.OrderService"3. autowire="byName"/>OrderService 类的属性名在容器中用于匹配bean实例。

自动绑定可能会节省一些键入工作量并减少混乱。

但是在现实项目中不应该使用这种方式,因为它牺牲了配置的可读性和可维护性。

许多指南和介绍中大肆吹捧自动绑定是Spring的一项极好的特性,而没有提到这一特性所带来的牺牲。

依我来看,这就像Spring 中的对象池(object-pooling),更大程度上只是宣传的噱头。

对于精简XML 配置文件来说,它是一个好办法,但它实际上增加了复杂性,尤其是在运行包含大量类声明的项目时。

虽然Spring允许混合使用自动绑定和显式绑定,但这会使XML配置更加晦涩难懂。

2.使用命名约定该原则对于Java编码也一样适用。

在项目中使用清晰的、描述性的、一致的命名约定将非常有利于开发人员理解XML配置。

例如,对于bean ID,可以按照Java 类字段名约定来命名它。

OrderServiceDAO实例的bean ID应该命名为orderServiceDAO。

对于大型项目,可以在bean ID前面加上包名作为前缀。

3. 使用简洁形式简洁形式避免了冗长,因为它将属性值和引用从子元素中移入属性中。

例如下面的例子:Java代码1.<bean id="orderService"2. class="com.lizjason.spring.OrderService">3. <property name="companyName">4. <value>lizjason</value>5. </property>6. <constructor-arg>7. <ref bean="orderDAO">8. </constructor-arg>9. </bean>可以使用简洁形式将上述代码重写为:Java代码1.<bean id="orderService"2. class="com.lizjason.spring.OrderService">3.4. <property name="companyName"5. value="lizjason"/>6. <constructor-arg ref="orderDAO"/>7. </bean>简洁形式自1.2版本起就可以使用。

注意,对于<ref local="...">,没有简洁形式。

简洁形式不但可以节约键入工作量,而且可以使XML配置文件更清晰。

当一个配置文件中定义了大量的类时,它可以显著提高可读性。

4. 对于构造函数参数匹配,类型比下标好当构造函数含有一个以上同种类型的参数,或者属性值的标签已经被占用时,Spring允许使用从0开始的下标来避免混淆。

例如:Java代码1.<bean id="billingService"2. class="com.lizjason.spring.BillingService">3. <constructor-arg index="0" value="lizjason"/>4. <constructor-arg index="1" value="100"/>5. </bean>利用type属性来编写会更好一些,如下:Java代码1.<bean id="billingService"2. class="com.lizjason.spring.BillingService">3. <constructor-arg type="ng.String"4. value="lizjason"/>5. <constructor-arg type="int" value="100"/>6. </bean>使用index可以减少一些代码,但是与type属性相比,它更易于出错且难于阅读。

只有在构造函数参数不明确的时候,才应该使用index。

5. 尽可能重用已定义的beanSpring 提供了一种类似于继承的机制来减少配置信息的复制并简化XML配置。

定义一个子类,它就可以从父类那里继承配置信息,而父类实际上成为子类的一个模板。

这就是大型项目中所谓的重用。

只需在父类bean中设置abstract=true,然后在子bean中指定parent引用。

例如:Java代码1.<bean id="abstractService" abstract="true"2. class="com.lizjason.spring.AbstractService">3. <property name="companyName"4. value="lizjason"/>5. </bean>6.7. <bean id="shippingService"8. parent="abstractService"9. class="com.lizjason.spring.ShippingService">10. <property name="shippedBy" value="lizjason"/>11. </bean>ShippingService类从abstractService类继承companyName属性的值——lizjason。

如果一个bean没有指定类或工厂方法,那么这个bean便是抽象的。

6. 在导入时,首选通过ApplicationContext来汇编bean定义像Ant脚本中的导入一样,Spring的import元素对于汇编模块化的bean定义来说是很有用的。

例如:Java代码1.<beans>2. <import resource="billingServices.xml"/>3. <import resource="shippingServices.xml"/>4. <bean id="orderService"5. class="com.lizjason.spring.OrderService"/>6. <beans>然而,相对于使用import在XML配置中进行预汇编,通过ApplicationContext 来配置这些bean则显得更加灵活。

使用 ApplicationContext的话,XML配置也更易于管理。

可以向ApplictionContext构造函数传递一组bean定义,如下:Java代码1.String[] serviceResources =2. {"orderServices.xml",3. "billingServices.xml",4. "shippingServices.xml"};5. ApplicationContext orderServiceContext = new6. ClassPathXmlApplicationContext(serviceResources);7. 使用id作为bean标识符可以指定一个id或名称来作为bean标识符。

虽然使用id不能提高可读性,但是它可以利用XML分析程序来对bean引用进行验证。

如果由于XML IDREF的约束而不能使用某个id,那么可以使用名称来作为bean的标识符。

XML IDREF的约束是:id必须以字母(或者XML规范中定义的标点符号)开头,后面是字母、数字、连字符、下划线、冒号或句点。

实际上,很少会遇到XML IDREF约束问题。

8. 在开发阶段使用依赖性检查(dependency-check)可以在bean定义中为dependency-check属性设置一个非默认值,比如simple、objects或all,以便容器进行依赖性检查。

当需要显式或通过自动绑定设置bean 的全部属性(或某类属性)时,依赖性检查便显得很有用。

Java代码1.<bean id="orderService"2. class="com.lizjason.spring.OrderService"3. dependency-check="objects">4. <property name="companyName"5. value="lizjason"/>6. <constructor-arg ref="orderDAO"/>7. </bean>在这个例子中,容器确保为orderService bean设置的属性不是primitives或collections。

相关主题