`

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

 
阅读更多

1.不要使用autowiring

Spring可以通过类的自省来自动绑定其依赖部分,使得你不必明确指明bean的 属性和构造器。Bean的属性可以通过属性名称或类型匹配来实现自动绑定。构造器通过类型匹配来实现自动绑定。你甚至可以指定自动检测自动绑定模式,它可 以引导Spring选择一种适当的运行机制。先来看看下面的一个例子:

class="com.lizjason.spring.OrderService"

autowire="byName"/>

OrderService类的属性名在容器中用于匹配bean实例。自动绑定可以潜 在地节省一些打字和减少一些混乱。但是在现实世界的工程里你不应该使用这种方式,这是因为它牺牲了配置的清晰性和可维护性。许多指南和介绍中大量吹捧自动 绑定是Spring的一种极好的特征而没有提到这一特性所带来的牺牲。依我的观点,这就像Spring中的object-pooling,它更像是一种为 了占据更多市场的商业特征。它对于XML配置文件的小巧化是一个好办法,但实际上也增加了复杂程度,尤其当你运行有大量类声明的工程时。虽然Spring 允许你混合自动绑定和手动绑定,但是这个矛盾会使XML配置更加晦涩难懂。

2.使用通俗的命名

这个方式对于Java编码也一样适用。在工程中使用清晰的、描述性的、协调的通俗名 称对于开发者理解XML配置是十分有益的。例如对于beanID,你可以根据通俗的Java类名来命名它。对于例子中OrderServiceDAO的 beanID命名为orderServiceDAO。对于大的工程,你可以在beanID前面加上包名作为前缀。

3.使用简洁的形式

简洁形式避免了冗长,是因为它从子元素中将属性值和参考写到属性中。例如下面的例子:

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

lizjason

可以使用简洁形式将上述代码重写为:

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

简洁形式功能在1.2版本中可以使用。对于没有简洁形式。

简洁形式不但可以节约你的打字,而且可以使XML配置文件清晰。它最引人注目的是当在一个配置文件中有大量定义的类时可以提高易读性。

4.对于构造器参数匹配,类型名比序号好。

当一个构造器含有一个以上的同种类型的参数,或者属性值的标签已经被占用时,Spring允许你使用从0计数的序号来解决这些会带来混淆的问题。例如:

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

像下面这样,利用类型属性来编写会更好一些:

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

value="lizjason"/>

使用索引可以稍稍减少一些冗长,但是和使用类型属性相比,它还是有容易发生错误的倾向和难于阅读的缺点。你应该只在构造器参数不明确的时候,才使用索引这一方法。

5.尽可能重用已定义过的bean

Spring提供一种类似继承一样的机制来减少配置信息的复制并简化XML配置。定 义一个子类可以从它父类那里继承配置信息,而父类实质上作为子类的一个模板。这就是大工程中所谓的重用。你所需要做的就是在父类bean中设置 abstract=true,然后在子bean注明它自己的父类bean。例如:

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

parent="abstractService"

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

ShippingService类从abstractService类那里继承companyName属性的值??lizjason。如果你没有为一个bean指明类或factory方法,那么这个bean便是抽象的。

6.尽量使用ApplicationContext来装配定义的bean

像在Ant脚本中的引用一样,Spring的引用对于装配模块化的bean来说是很有用的。例如:

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

相对于使用import在XML配置中来预装配,通过 ApplicationContext来配置这些beans,显得更加灵活。利用ApplicationContext也使得XML配置易于管理。你可以 像下面的例子那样在ApplictionContext构造器里布置bean:

String[]serviceResources=

{"orderServices.xml",

"billingServices.xml",

"shippingServices.xml"};

ApplicationContextorderServiceContext=new

ClassPathXmlApplicationContext(serviceResources);

7.利用id作为bean的标识符

你可以指定一个id或名称来作为bean的标识符。虽然使用id不会提高易读性,但 是它可以让XMLparser对bean的引用有效方面进行更好的验证。如果由于XMLIDREF的限制而不能使用某个id,你可以利用names来作为 bean的标识符。XMLIDREF的限制是id必须以字母开头(或者在XML规范中定义的标点符号),后面接着字母,数字,连字号,下划线,冒号等。实 际上,遇到XMLIDREF限制的问题是很少见的。

8.在开发阶段使用依赖检验

你可以在bean中给依赖检验的属性设置值,而不采用原先默认的空值,属性设置例如simple,object或all,以便容器进行依赖检验。当bean的全部的属性(或某类属性)需要被明确设置或自动绑定时,依赖检验便显得很有用。

class="com.lizjason.spring.OrderService"

dependency-check="objects">

在这个例子里,容器确保为orderServicebean设置的属性不是primitives或者collections。为所有的bean设置默认依赖检测也是可以的,但是我们很少这样做,是因为有些bean的属性根本就不必设置。

9.为每个配置文件加上一个headercomment

最好使用descriptiveid和名称来代替在XML配置文件中的注释。此外,加上一个配置文件header也很有用处,它可以概述文件中所定义的bean。你可以选择将描述内容加入description标签中。例如:

Thisfiledefinesbillingservice

relatedbeansanditdependson

baseServices.xml,whichprovides

servicebeantemplates...

...

使用description标签的一个好处是可以容易地利用工具从标签中选取出description(的内容)。

10.对于任何变化,要与队友积极交流

当你重构Java代码时,你需要随时更新配置文件并且通知队友。XML配置文件也是代码,它们是应用程序的至关重要的部分,但是它们难于阅读和维护。大部分时间你既要阅读XML配置文件又要阅读运行中的Java代码。

11.Setterinjection优于constructorinjection

Spring提供3种类型的依赖注入:constructorinjection,setterinjection,和methodinjection。我们一般只用前两种类型。

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

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

这个例子中,orderService类使用的是 constructorinjection,而BillingService类使用的是setterinjection。 constructorinjection可以确保bean不会在一个非法状态下被创建,但是setterinjection更加灵活并且更易管理,尤其 当类存在很多属性并且其中一些是可选的情况下。

12.不要滥用依赖注入

作为最后一点,SpringApplicationContext可以替你创建 Java对象,但是并不是所有的Java对象都通过依赖注入来创建的。例如,全局的对象不应该通过ApplicationContext来创建。 Spring是一个很棒的框架,但是,就易读性和易管理性而言,当定义大量bean的时候,基于XML的配置问题就会突出。过度的依赖注入会使XML配置 变得复杂而且臃肿。记住!使用强大的IDE时,例如Eclipse和IntelliJ,与XML文件相比,Java代码更加易读,易维护,易管理。

总结

对于Spring的配置,XML是很优秀的方式。但当定义大量bean时,基于 XML配置会变得冗长,笨拙。Spring提供了丰富的配置选项。适当地利用其中的选项可以使XML配置清晰,但是,有些选项,例如autowiring (自动绑定),往往会降低易读性和易维护性。文章中所列举的实例,可以帮助你创建出清晰易读的XML配置文件。(T007)

分享到:
评论

相关推荐

    Spring XML配置十二个最佳实践

    Spring XML配置十二个最佳实践

    websevice,spring,cxg,ibatis

    CXF环境配置 - jackymin CXF与Spring的集成 log4j的配置使用 Spring XML配置十二个最佳实践WebService开发实例 (Xfire+Spring+Hibernate)

    spring-boot-best-practices-sample:Spring Boot 2.x最佳实践样本

    Spring Boot 使用自动配置技术,可以做到零配置XML文件,当然如果想用XML配置Bean,Spring Boot 也保持了兼容。 Spring Boot 无疑如今已经成为Java 后端开发的行业标准,学会Spring Boot与各种技术集成是必学技能。 ...

    精通spring--源代码

    包括忘却的Spring高级话题,Spring最佳实践  对Spring2.5内置的各种XML Schema支持进行了全方位阐述。包括基于XML Schema的权威配置指南  全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本...

    精通Spring(书签)

    包括忘却的Spring高级话题,Spring最佳实践  对Spring2.5内置的各种XML Schema支持进行了全方位阐述。包括基于XML Schema的权威配置指南  全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本...

    spring.net中文手册在线版

    16.1.2. XML配置 16.1.3.管理连接字符串 第十七章. 使用ADO.NET进行数据访问 17.1.简介 17.2.动机 17.3.Provider抽象 17.3.1.创建IDbProvider类型的实例 17.4.命名空间 17.5.数据访问的方式 17.6.AdoTemplate简介 ...

    精通Spring (书签版)

    包括忘却的Spring高级话题,Spring最佳实践  对Spring2.5内置的各种XML Schema支持进行了全方位阐述。包括基于XML Schema的权威配置指南  全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本...

    精通Spring(书签版)

    包括忘却的Spring高级话题,Spring最佳实践  对Spring2.5内置的各种XML Schema支持进行了全方位阐述。包括基于XML Schema的权威配置指南  全书理论与实践并重,通过大量的实例帮助读者尽快掌握Spring2,5的各种基本...

    enterprise-spring-best-practices:企业Spring最佳实践

    企业Spring最佳实践 博客系列“ Enterprise Spring最佳...02 Spring XML配置 引导程序配置文件 SLF4J和Logback配置 Apache Commons(又名Jakarta Commons / JCL) Java Util(又名JUL) System.out和System.err 资源

    一个基于Spring Boot & MyBatis的种子项目,用于快速构建中小型API、RESTful API项目~

    最佳实践的项目结构、配置文件、精简的POM(查看项目结构图) 统一响应结果及生成工具 统一异常处理 简单的接口签名认证 使用基础方法抽象封装 使用Druid Spring Boot Starter集成Druid数据库连接池与监控 使用...

    wsdl2java源码-spring-boot-cxf-integration-noxml:SpringBoot和CXF集成,无需xml配置

    服务正常工作所需的最少部分,因此我们尝试使其尽可能简单,但遵循最佳实践。 创建 Web 服务的步骤 创建 XSD 文件 考虑 Web 服务将接收和发送回的数据并设计 xsd 文件。 我发现将一个 xsd 用于“输入”参数,一个...

    SpringMVC-SpringSecurity-MySql-Hibernate

    将Dispatcher Servlet与web.xml一起设置的最佳实践。 配置Spring Security并创建经过身份验证的页面,例如“登录”页面和“管理页面” 。 用于在具有授权角色的数据库上创建安全用户的安全上下文集成。 (本教程...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    BlazeDS 将读取 services-config.xml 配置文件,该配置文件又引用了 remoting-config.xml、proxy-config.xml 和 messaging-config.xml 这 3 个配置文件,所以,一共需要 4 个配置文件。 由于 BlazeDS 需要将 Java ...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    BlazeDS 将读取 services-config.xml 配置文件,该配置文件又引用了 remoting-config.xml、proxy-config.xml 和 messaging-config.xml 这 3 个配置文件,所以,一共需要 4 个配置文件。 由于 BlazeDS 需要将 Java ...

    Spring Boot & MyBatis种子项目,用于快速构建中小型API、RESTful API项目

    - 最佳实践的项目结构、配置文件、精简的POM([查看项目结构图] - 统一响应结果封装及生成工具 - 统一异常处理 - 简单的接口签名认证 - 常用基础方法抽象封装 - 使用Druid Spring Boot Starter 集成Druid数据库连接...

    jaxrs-sample:用于最佳 REST 实践的基于 REST JAX-RS CXF 的示例脚手架

    REST JAX-RS CXF Spring 最佳实践模板。 描述 从非持久内存数据存储中添加、检索和删除存储的示例应用程序。 PUT - 使用客户端提供的 ID 添加或更新存储 GET - 获取商店 DELETE - 删除存储 特征 多模块maven项目 ...

    Mybatis.PDF

    在不同方面的应用以及在使用过程中的最佳实践方案。针对 MyBatis 高级映射、存储过程和类型处理器提 供了丰富的示例,通过自下而上的方法使读者更好地理解和掌握 MyBatis 的高级用法,同时针对 MyBatis 的代码生成...

    基于springboot的网上购物商城系统研发.zip

    "基于springboot的网上购物商城系统研发.zip"是一个针对开发网上购物商城系统的项目压缩包。该项目使用Spring Boot框架,这是一...同时,它也适合用作教学材料,帮助学生或初学者了解现代Web应用的开发流程和最佳实践。

    MyBatis 从入门到精通

    通过全面的示例代码和测试讲解了在 MyBatis XML 方式和注解方式中进行增、删、改、查操作的基本用法,介绍了动态 SQL 在不同方面的应用以及在使用过程中的最佳实践方案。针对 MyBatis 高级映射、存储过程和类型...

    《MyBatis 从入门到精通》源代码

    通过全面的示例代码和测试讲解了在 MyBatis XML 方式和注解方式中进行增、删、改、查操作的基本用法,介绍了动态 SQL 在不同方面的应用以及在使用过程中的最佳实践方案。针对 MyBatis 高级映射、存储过程和类型...

Global site tag (gtag.js) - Google Analytics