Chapter 2. Spring 2.0 的新特性

2.1. 简介

如果你已经用了一段时间Spring Framework,那你将发现Spring正在经历着一场大的修订。

修订版引入一些新特性,总结并改进了许多现有功能。实际上,Spring得到了大量有价值的更新,以至于Spring开发团队决定在Spring的下一个版本里修改版本号; 所以2005年12月,在佛罗里达召开的Spring经验交流会上,Spring 2.0 问世了。

本章是对Spring 2.0新特性与改进特性的向导。我们希望提供一个高层的概述使那些有经验的Spring架构师与开发人员能很快熟悉Spring 2.0的新功能。 如果想了解关于特性更多更深层的信息,请参考在本章里超链接的相应部分。

下面介绍的一些新的或者改进的功能已经(或将要)被加入Spring 1.2.x中。 如果想知道某功能是否被加入1.2.x版本中,请参考1.2.x发布包的changelog。

2.2. 控制反转(IoC)容器

Spring 2.0 相当大的改进之一就是Spring的IoC容器。

2.2.1. 更简单的XML配置

多亏了新的基于XML Schema的XML配置语法的产生,Spring的XML配置变的更加简单了。如果你想充分利用Spring提供的新标签(Spring团队当然建议你这么做,因为他们使配置变的不再繁琐,更加易于阅读),请阅读标题为 Appendix A, XML Schema-based configuration 的部分。

相关提示,请引用新的Spring 2.0 DTD以使用基于XML Schema的配置。下面给出了DOCTYPE声明,如果有兴趣的读者可以详细阅读Spring 2.0发布包的 'dist/resources'目录中的'spring-beans-2.0.dtd' DTD。

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
			  "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

2.2.2. 新的bean作用域

Spring上个版本的IoC容器支持两个不同的bean作用域(单例与原型)。Spring 2.0改进了这一点,不仅提供了一些依赖于Spring部署环境(比如说,在web环境中的request和session作用域bean)的额外的作用域,而且提供了所谓的'钩子'('hooks')(因为找不到更好的表达)使Spring用户可以创造自己的作用域。

应该注意的是,即使单例与原型作用域beans的基本(内在)实现发生了变化,上述变化对最终用户来说是透明的...现有的配置不需要改变或放弃。

在标题为 Section 3.4, “bean的作用域” 的部分有对新增的作用域与原有作用域的详细描述。

2.2.3. 可扩展的XML编写

XML配置不仅更加易于书写,而且也具有可扩展性。

这里'可扩展性'的含义是,作为一个应用程序开发人员,或着(更可能)作为第三方框架或产品的供应商,可以开发自定义标签,供其他开发人员把这些标签嵌入到自己的Spring配置文件里。你可以在组件的特定配置中定义你自己的DSL(domain specific language,这个词在这里用得比较宽泛)。

对于个别应用的开发人员或者在项目中运用Spring的企业架构师来说,实现自定义Spring标签可能不是他们的兴趣所在。我们期待着第三方供应商能够对开发在Spring配置文件里使用的自定义配置标签予于足够的关注。

可扩展的配置机制在 Appendix B, Extensible XML authoring 里有更充分的描述。

2.3. 面向切面编程(AOP)

Spring 2.0在AOP上有很大的改进。Spring AOP框架本身就十分易于用XML配置,不再那么繁琐;Spring 2.0集成了AspectJ 切入点(pointcut)语言和 @AspectJ 切面(aspect)声明类型。 标题为 Chapter 6, 使用Spring进行面向切面编程(AOP) 的部分专门描述这个新支持。

2.3.1. 更加简单的AOP XML配置

Spring 2.0引入了新的模式,支持定义从常规Java对象中发展中来的切面。 此支持充分利用了AspectJ切入点语言,提供了完整类型的通知(advice)(也就是没有多余转换和 Object[] 参数操作)。 标题为 Section 6.3, “Schema-based AOP support” 的部分详细描述了该支持的细节。

2.3.2. 对@AspectJ 切面的支持

Spring 2.0也支持使用@AspectJ注解定义的切面。这些切面可以在AspectJ与Spring AOP中共享,仅仅需要(老实说!)一些简单的配置。 在标题为 Section 6.2, “@AspectJ支持” 的部分讨论了对@AspectJ切面的支持。

2.4. 中间层

2.4.1. 在XML里更为简单的声明性事务配置

Spring 2.0关于事务的配置方式发生了重大的变化。早先的1.2.x版本的配置方式仍然有效(并且受支持),但是新的方式明显更加简洁,并成为最推荐的方式。 Spring 2.0 同时提供了AspectJ切面库,你可以使用它来生成更漂亮的事务性对象 - 甚至可以不是由Spring IoC容器产生的。

标题为 Chapter 9, 事务管理 的部分包含所有的细节。

2.4.2. JPA

Spring 2.0提供了JPA抽象层,在所起的作用与常规使用模式上,类似于Spring的JDBC抽象层。

如果你对使用实现JPA作为自己持久层的基础感兴趣,标题为 Section 12.6, “JPA” 的部分专门描述了在这个领域Spring的支持与附加值。

2.4.3. 异步的JMS

在Spring 2.0之前,Spring的JMS的作用局限于发送消息和同步接收消息。 这个功能(封装在 JmsTemplate 类中)当然是很好的, 但是,它没有满足异步消息接收的需要。

Spring 2.0现在提供对异步消息接收的完整支持。在标题为 Section 19.4.2, “异步接收 - 消息驱动的POJOs” 的部分有详细的描述。

2.4.4. JDBC

在Spring的JDBC支持库中,有几个小的(但同样值得注意的)新类。首先,NamedParameterJdbcTemplate, 提供了在编写JDBC语句时,对使用命名参数(与之相对的是编写JDBC语句时只使用常规的占位符('?'))的支持。

另一个新类,SimpleJdbcTemplate, 致力于在使用Java 5+ (Tiger)开发时更加简单地使用JdbcTemplate

2.5. Web层

在Spring 2.0里,web层支持得到了 充分地 改进和扩展。

2.5.1. Spring MVC的表单标签库

Spring MVC丰富的JSP标签库 来自 JIRA,其中的绝大部分是Spring用户(范围很广的用户)通过投票方式产生的。

Spring 2.0拥有一个丰富的JSP标签库,在使用Spring MVC时,编写JSP页面变得更加简单;Spring团队自信地认为它将满足所有在JIRA上投票的开发人员的需要。在标题为 Section 13.9, “使用Spring的表单标签库” 的部分描述了新的标签库,标题为 Appendix E, spring-form.tld 的附录部分是对所有新标签的快速指南。

2.5.2. Spring MVC合理的默认值

对于很多项目而言,遵守建立好的规范,使用合理的默认值,是项目所必须的... 现在在SpringMVC里,惯例优先(convention-over-configuration)的观点有了明确的支持。 这就意味着当你为控制器和视图建立一系列的命名规范时,你可以 充分 减少XML配置的数量,包括设置处理映射、视图解析、ModelAndView的实例等等。 对于开发快速原型来说,这有非常大的优势,并且越过代码库可以产生一定的连续性(通常是良好的)。

在标题为 Section 13.11, “惯例优先原则(convention over configuration)” 的部分,可以发现对Spring MVC的惯例优先支持的详细内容。

2.5.3. Portlet 框架

Spring 2.0 设计了一种概念上类似于Spring MVC框架的Porlet框架。标题为 Chapter 16, Portlet MVC框架 的部分可以找到详细的介绍。

2.6. 其他特性

最后部分罗列了所有其他关于Spring 2.0的新特性与改进特性。

2.6.1. 动态语言支持

Spring 2.0现在支持用非Java语言编写的bean,当前支持的动态语言包括JRuby,Groovy和BeanShell。标题为 Chapter 24, 动态语言支持 部分描述了动态语言支持的细节。

2.6.2. JMX

Spring Framework开始支持通知(Notification); 还可以声明式地控制MBean在一个MBeanServer上的注册行为。

2.6.3. 任务规划

关于任务规划,Spring 2.0 提供了一种抽象。对于感兴趣的开发人员,标题为 Section 23.4, “SpringTaskExecutor抽象” 的部分提供了所有的细节。

2.6.4. 对Java 5(Tiger)的支持

如果你有幸使用Java 5(Tiger)进行项目开发,你将很高兴地发现,Spring 2.0对于Tiger有一些非常引人注目的支持。下面是一系列Spring Java 5 独有特性的指南

2.7. 移植到Spring 2.0

最后一节中详细说明了从Spring 1.2.x移植到Spring 2.0的过程中可能出现的问题。

先让我们来有所保留地看看下面这句话, 从Spring 1.2移植到Spring 2.0应该就是简单地把Spring 2.0的jar文件放进应用程序目录中的合适位置。

上一句话的关键字理所当然是“应该”。 到底是不是无缝升级依赖于你的代码中究竟用了多少Spring API。 Spring 2.0移除了很多在Spring 1.2.x代码库中标为deprecated的代码,所以如果你用了这些类或方法, 你应该使用它们的替代类或方法(下面总结了些)。

关于配置,Spring 1.2.x风格的XML配置与Spring 2.0完全兼容。你仍然可以继续使用Spring 1.2.x DTD, 不过这样你就不能充分利用一些Spring 2.0的新功能(例如作用域更易用的AOP事务配置), 但绝对不会有问题。

建议的移植策略是放入Spring 2.0的jar文件以便能使用改进过的代码(修正bug、优化等等)。 然后增量地开始尝试Spring 2.0的新特性和配置。例如,你可以选择先在切面配置上运用Spring 2.0风格作为开始; 90%的旧式Spring 1.2.x配置(引用1.2.x DTD)加上10%的Spring 2.0配置(引用2.0 DTD和XSD)是完全有效的。要记住, 在使用Spring 2.0库的同时并非一定要升级XML配置。

2.7.1. 一些变化

如需了解全部变化,请参考Spring Framework 2.0发布包顶层目录里的'changelog.txt'文件。

2.7.1.1. Jar包

1.2.x和2.0的Spring Framework jar文件有很多不同之处。 特别是现在JDO、Hibernate 2/3、TopLink的ORM集成类有专门的jar文件:它们不再被打包在核心文件 'spring.jar'中了。

2.7.1.2. XML配置

Spring 2.0的XSD在描述Spring XML元数据格式方面比先前的DTD更丰富。 旧的DTD仍然得到支持,但如果可能我们鼓励在bean定义文件头部引用XSD文件。

有一点被改变了,那就是定义bean作用域的方式。如果你使用的是Spring 1.2 DTD,那么你能继续用'singleton'属性。 如果你选择引用新的Spring 2.0 DTD,它不允许使用'singleton'属性, 那么可以用'scope'属性来定义bean的生命周期作用域。

2.7.1.3. Deprecated的类和方法

一些以前被标记为@deprecated的类和方法Spring 2.0代码库中被完全删除了。 Spring团队决定把2.0版本作为一个新的开始,那些被deprecated的代码应该被除去而不是在可预见的未来继续在代码中出现。

就如前面所说的,如需了解全部变化,请参考Spring Framework 2.0发布包顶层目录里的'changelog.txt'文件。

下面的类/接口已经从Spring 2.0的代码中删除了。

  • ResultReader : 使用RowMapper接口代替。

  • BeanReferenceFactoryBean : 使用别名机制代替

  • BeanDefinitionRegistryBuilder : 使用BeanDefinitionReaderUtils类上的方法代替

  • BeanFactoryBootstrap : 考虑使用一个BeanFactoryLocator 或是自定义引导类代替

  • RequestUtils : 使用ServletRequestUtils代替

2.7.1.4. Apache OJB

请注意Spring主代码中的Apache OJB支持被完全删除了; 但仍然可以在Spring Modules项目中找到Apache OJB的集成库。

2.7.1.5. iBatis

请注意iBATIS SQL Maps 1.3支持被完全去除了。如果你还在使用iBATIS SQL Maps 1.3, 请升级到iBATIS SQL Maps 2.0/2.1。

2.8. 更新的样例应用

我们同样更新了一些样例应用以反映Spring 2.0的新特性与改进特性,请抽出时间仔细研究。 上述样例放在Spring完整发行版里的'samples'路径下 ('spring-with-dependecies.[zip|tar.gz]')。

上述发行版同时提供了一些所谓的体现特性优势的应用。每个应用都提供了完整的例子,一次演示一个Spring 2.0的新特性。 这意味着你可以在这些应用中运行代码,而不需再自己创建小工程测试Spring 2.0的新特性。我们故意将这些应用的作用域设定的很小; 作用域模型(如果有的话)可能只有一两个类,而典型的企业关注点,如安全和事务完整性,显然没有包含在内。

2.9. 改进的文档

Spring参考文档理所当然的进行了充分的更新,以反映上述Spring 2.0的新特性。

尽管我们竭尽所能立争这份文档不会出现错误,但是人非圣贤,错误在所难免。 如果您发现了一些打印排版或者更严重的错误,并可以抽出一些空闲时间来的话, 请通过 问题提交 把错误发给Spring团队。

特别感谢Arthur Loder,谢谢他不辞辛劳地校对Spring Framework的参考文档和Javadocs。