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元素中加入描述信息。例如:
<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配置文件
分享到:
相关推荐
本实践指南将深入探讨Spring配置的最佳实践,旨在帮助开发者优化代码,提高应用的可维护性和可扩展性。 一、XML配置与Java配置的选择 Spring最初是以XML配置为主,但随着版本的更新,Java配置逐渐成为首选。Java...
《Spring Cloud最佳实践项目详解》 在现代微服务架构中,Spring Cloud以其强大的服务治理能力,成为了Java开发者构建分布式系统的重要工具。本项目实例深入探讨了Spring Cloud的最佳实践,涵盖了Spring Cloud全家桶...
该项目为Spring Cloud Alibaba框架下的Spring Cloud最佳实践设计源码,包含178个文件,涵盖113个Java源文件、37个XML配置文件、18个VM模板文件、6个YAML配置文件、3个备份文件和1个SQL脚本文件,旨在展示代码的艺术...
《Spring 2.0 核心技术与最佳实践》是由知名IT教育家廖雪峰编写的教程,旨在为从初学者到高级工程师提供全面而深入的Spring 2.0框架理解与应用指导。Spring框架是Java开发中的核心工具,尤其在企业级应用中广泛使用...
《Spring核心技术与最佳实践》一书深入探讨了Java EE Web开发中的关键技术和Spring框架的应用。Spring作为一款强大的IoC容器,不仅提供了卓越的依赖注入功能,还具备完整的Web MVC框架,使得开发高效、可扩展的Web...
### Spring配置文件:整理与总结Spring中XML配置的最佳实践 #### 概述 Spring框架作为一个强大的Java应用框架,在企业级应用开发中占据了重要的地位。它为普通的Java对象(Plain Old Java Objects, POJOs)提供了...
### Spring XML配置十二个最佳实践 #### 一、利用自动装配简化配置 在Spring框架中,自动装配(Autowiring)是一种非常实用的功能,它能够帮助我们减少对Bean依赖关系的手动配置工作量。通过设置`autowire`属性,...
Java EE 设计模式:Spring 企业级开发最佳实践 Java EE 设计模式是指在 Java 企业版(Java Enterprise Edition)中应用的设计模式,旨在提高软件系统的可维护性、可扩展性和可重用性。Spring 是当前最流行的 Java ...
Java EE设计模式与Spring企业级开发最佳实践是Java开发者深入理解框架和提升应用设计能力的重要领域。本资源包含了Spring框架中常见的设计模式及其在实际项目中的应用实例,这些实例是基于书中可运行的项目源代码。...
《Spring 2.0核心技术最佳实践源代码》是关于Spring框架深入学习的重要参考资料,尤其针对Spring 2.0版本的核心特性进行了详细的解析和实践。在第十章中,我们将会探讨以下几个关键知识点: 1. **AOP(面向切面编程...
#### 五、Spring配置最佳实践 - **遵循最小化原则**:尽量减少配置的数量,避免不必要的复杂性。 - **利用注解配置**:尽可能使用注解配置代替XML配置,这样可以使代码更加简洁。 - **合理利用命名空间**:根据实际...
本资源将通过一系列真实的学习案例,帮助用户深入理解和掌握 Spring Boot 的核心技术和最佳实践。 ### 资源内容概述: 1. **Spring Boot 简介**: - 介绍 Spring Boot 的基本概念、优势以及其在现代应用开发中的...
《Hibernate 3.5与Spring 2.5.5整合的最佳实践》 在现代Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,与Spring框架的结合使用是常见的做法。本篇将深入探讨如何将Hibernate 3.5与Spring...
在基于Spring的开发中,最佳实践是至关重要的,它们能够帮助开发者提高代码质量,提升系统性能,以及确保项目的可维护性和扩展性。以下是一些基于提供的文件内容的关键知识点: 1. **Spring WebFlux**: Spring ...
这篇文档"基于Spring框架的开发最佳实践.pdf"涵盖了多个与Spring相关的主题,包括使用Spring Data进行MongoDB 4.0事务处理、构建message-driven微服务、Spring Boot配置、前端集成、日志管理、WebFlux错误处理以及...
### Spring配置全书知识点概述 ...综上所述,《Spring配置全书》不仅涵盖了Spring框架的基础配置知识,还深入探讨了高级配置技巧和最佳实践,是Java开发人员学习和使用Spring框架不可或缺的参考资料。
基于条件注解(@Conditional),Spring Boot会根据类路径中的jar包和配置文件自动配置相应的bean。例如,如果类路径下存在HSQLDB数据库,那么Spring Boot就会自动配置一个内存数据库。 3. **嵌入式Web服务器...