`
hongan
  • 浏览: 175648 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

Spring XML配置十二个最佳实践

    博客分类:
  • Java
阅读更多

在这篇文章里,对于 Spring XML 的配置,我将向你展示12 种比较好的实践。其中的一些实践不仅是好的实践,更是必要的实践。除此以外,还有其他因素,例如领域模型的设计,都能影响XML 的配置,但是这篇文章重点研究XML 配置的易读性和易管理性。

   1 。不要使用autowiring

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

  

以下是引用片段:
< bean id="orderService" class="com.lizjason.spring.OrderService" autowire="byName"/>

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

   2. 使用通俗的命名

  这个方式对于Java 编码也一样适用。在工程中使用清晰的、描述性的、协调的通俗名称对于开发者理解XML 配置是十分有益的。例如对于bean ID ,你可以根据通俗的Java 类名来命名它。对于例子中OrderServiceDAObean 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 配置文件清晰。它最引人注目的是当在一个配置文件中有大量定义的类时可以提高易读性。

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

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

  

以下是引用片段:
< bean id="billingService"
  class="com.lizjason.spring.BillingService">
  < constructor-arg index="0" value="lizjason"/>
  < constructor-arg index="1" value="100"/>
  < /bean>

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

  

以下是引用片段:
< bean id="billingService"
  class="com.lizjason.spring.BillingService">
  < constructor-arg type="java.lang.String"
  value="lizjason"/>
  < constructor-arg type="int" value="100"/>
  < /bean>

 

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

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

  Spring 提供一种类似继承一样的机制来减少配置信息的复制并简化XML 配置。定义一个子类可以从它父类那里继承配置信息,而父类实质上作为子类的一个模板。这就是大工程中所谓的重用。你所需要做的就是在父类bean 中设置abstract=true ,然后在子bean 注明它自己的父类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 类从abstractService 类那里继承companyName 属性的值??lizjason 。如果你没有为一个bean 指明类或factory 方法,那么这个bean 便是抽象的。
  6.  尽量使用ApplicationContext 来装配定义的bean
  像在Ant 脚本中的引用一样,Spring 的引用对于装配模块化的bean 来说是很有用的。例如:
  < beans>
  < import resource="billingServices.xml"/>
  < import resource="shippingServices.xml"/>
  < bean id="orderService"
  class="com.lizjason.spring.OrderService"/>
  < beans>

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

  

以下是引用片段:
String[] serviceResources =
  {"orderServices.xml",
  "billingServices.xml",
  "shippingServices.xml"};
  ApplicationContext orderServiceContext = new
  ClassPathXmlApplicationContext(serviceResources);

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

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

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

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

  

以下是引用片段:
< bean id="orderService"
  class="com.lizjason.spring.OrderService"
  dependency-check="objects">
  < property name="companyName"
  value="lizjason"/>
  < constructor-arg ref="orderDAO"/>
  < /bean>

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

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

  最好使用descriptive id 和名称来代替在XML 配置文件中的注释。此外,加上一个配置文件header 也很有用处,它可以概述文件中所定义的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 标签的一个好处是可以容易地利用工具从标签中选取出description( 的内容)

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

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

   11. Setter injection 优于constructor injection

  Spring 提供3 种类型的依赖注入: constructor injection,setter injection, method injection 。我们一般只用前两种类型。

  

以下是引用片段:
< 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 类使用的是constructor injection ,而BillingService 类使用的是setter injectionconstructor injection 可以确保bean 不会在一个非法状态下被创建,但是setter injection 更加灵活并且更易管理,尤其当类存在很多属性并且其中一些是可选的情况下。

   12. 不要滥用依赖注入

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

   总结

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

分享到:
评论

相关推荐

    Spring中XML配置文件的十二个最佳方法.doc

    本文将详细解析Spring中XML配置文件的十二个最佳实践,主要关注前六个方法。 1. **避免使用自动绑定(Autowiring)** Spring的自动绑定功能允许框架通过类的自省自动注入依赖。虽然可以减少手动配置,但会导致配置...

    廖雪峰 Spring 2.0 核心技术与最佳实践 高清扫描版

    《Spring 2.0 核心技术与最佳实践》是由知名IT教育家廖雪峰编写的教程,旨在为从初学者到高级工程师提供全面而深入的Spring 2.0框架理解与应用指导。Spring框架是Java开发中的核心工具,尤其在企业级应用中广泛使用...

    spring配置最佳实践.zip

    本实践指南将深入探讨Spring配置的最佳实践,旨在帮助开发者优化代码,提高应用的可维护性和可扩展性。 一、XML配置与Java配置的选择 Spring最初是以XML配置为主,但随着版本的更新,Java配置逐渐成为首选。Java...

    Spring中XML配置文件的十二个最佳方法[借鉴].pdf

    本文主要探讨了Spring XML配置文件的六个最佳实践,旨在提升代码的可读性、可维护性以及整体项目的结构。以下是这六个方法的详细说明: 1. 避免使用自动绑定(autowiring) 自动绑定允许Spring通过bean类的自省来...

    Spring全注解project示例 (无web.xml配置)

    标题 "Spring全注解project示例 (无web.xml配置)" 提供了我们即将探讨的核心主题:一个使用Spring框架,完全依赖注解配置的项目,且没有传统的web.xml部署描述符。这种配置方式在现代Spring应用中非常常见,因为它...

    websevice,spring,cxg,ibatis

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

    Spring+SpringMVC+Mybatis整合所需jar包以及xml配置文件配置方式

    6. **最佳实践**:在实际开发中,为了保持代码整洁,通常会将不同层次的配置分开,如将Spring的bean定义放在`applicationContext.xml`,SpringMVC的配置放在`servlet-context.xml`,Mybatis的配置放在`mybatis-...

    Spring Boot技术知识点:如何读取不同路径里的applicationContext.xml配置文件4

    创建一个名为`org.springframework.boot.autoconfigure.EnableAutoConfiguration`的键,并将你的XML配置文件对应的`Configuration`类名作为值添加进去。 3. **自定义BeanDefinitionReader** 你可以创建一个自定义...

    Java EE设计模式:Spring企业级开发最佳实践

    Java EE 设计模式:Spring 企业级开发最佳实践 Java EE 设计模式是指在 Java 企业版(Java Enterprise Edition)中应用的设计模式,旨在提高软件系统的可维护性、可扩展性和可重用性。Spring 是当前最流行的 Java ...

    spring2.0核心技术最佳实践源代码

    《Spring 2.0核心技术最佳实践源代码》是关于Spring框架深入学习的重要参考资料,尤其针对Spring 2.0版本的核心特性进行了详细的解析和实践。在第十章中,我们将会探讨以下几个关键知识点: 1. **AOP(面向切面编程...

    Spring2.0 核心技术与最佳实践 随书源码

    《Spring2.0 核心技术与最佳实践》是一本深度解析Spring框架2.0版本的书籍,其随书源码提供了丰富的实例和代码,帮助读者深入理解Spring的核心特性和应用策略。虽然源码中不包含`lib`包,但我们可以根据Spring2.0的...

    hibernate3.5与spring2.5.5整合最佳实践

    《Hibernate 3.5与Spring 2.5.5整合的最佳实践》 在现代Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,与Spring框架的结合使用是常见的做法。本篇将深入探讨如何将Hibernate 3.5与Spring...

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

    Spring团队意识到这个问题后,为了摆脱繁琐的XML配置,就推出了Spring Boot. Spring Boot 使用自动配置技术,可以做到零配置XML文件,当然如果想用XML配置Bean,Spring Boot 也保持了兼容。 Spring Boot 无疑如今已经...

    spring_2021.7.14.zip

    标题中的"spring_2021.7.14.zip"表明这是一份关于Spring框架的资料,时间戳为2021年7月14日,...对于想要学习或复习Spring框架的人来说,这是一个宝贵的资料库,可以系统性地了解和掌握Spring的核心功能和最佳实践。

    Spring Boot整合Spring Batch,实现批处理

    在Java开发领域,Spring Boot和Spring Batch的整合是构建高效...通过学习和实践这个示例,你不仅可以掌握如何在Spring Boot中使用Spring Batch,还能了解批处理的最佳实践,这对于处理大数据量的应用场景非常有价值。

    Spring的Bean配置

    1. **XML配置**:传统的Spring配置通常使用XML文件,如`beans.xml`,其中包含了Bean的定义,包括类名、初始化方法、属性等。例如: ```xml &lt;value&gt;constructorValue ``` 2. **注解配置**:随着Java...

    配置 google app 配置 spring. 配置jdo

    这个过程涉及的技术深度和广度都相当大,涵盖了许多Java开发的最佳实践。通过这样的集成,开发者可以利用Spring的强大功能和GAE的云服务优势,同时享受到JDO带来的简单和高效的数据库操作体验。在实际开发中,还需要...

    【面试资料】-(机构内训资料)看透Spring MVC源代码分析与实践.zip

    - 如何编写Controller,包括注解驱动和XML配置方式。 - RESTful API设计与Spring MVC的结合。 - 数据绑定和验证,如@ModelAttribute和Validator的使用。 - 异常处理,全局异常处理器GlobalExceptionResolver的...

    JavaEE spring和Hibernate整合(没有hibernate.cfg.xml)

    在这个场景中,我们将探讨如何在不使用`hibernate.cfg.xml`配置文件的情况下整合Spring和Hibernate。 通常,Hibernate通过`hibernate.cfg.xml`文件来配置数据库连接、实体类映射等信息。但在Spring中,我们可以利用...

Global site tag (gtag.js) - Google Analytics