Chapter 2. Spring 2.0和 2.5的新特性

2.1. 简介

如果你已经用了一段时间的Spring Framework,那你将发现Spring经历了两次大的修订: 一次是2006年10月发布的Spring 2.0, 另一次是2007年11月发布 Spring 2.5 。

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

2.2. 控制反转(IoC)容器

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

2.2.1. 新的bean作用域

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

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

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

2.2.2. 更简单的XML配置

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

相关提示,有一个新的更新过的Spring 2.0的DTD。如果你不能使用基于Schema的XML配置,你可以使用它。下面给出了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.3. 可扩展的XML编写

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

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

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

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

2.2.4. Annotation(注解)驱动配置

Spring 2.0 引入了一些用于配置的annotation, 包括 @Transactional, @Required and @PersistenceContext /@PersistenceUnit.

Spring 2.5 引入了用于配置的完整的Annotation集合: @Autowired,以及对JSR-250注解@Resource, @PostConstruct and @PreDestroy的支持。

Annotation驱动的bean 配置在Section 3.11, “基于注解(Annotation-based)的配置”中讨论。也请查阅对Spring MVC的annotation的支持Section 2.5.3, “基于Annotation的控制器”

2.2.5. 在classpath中自动搜索组件

Spring2.5 引入了组件搜索功能:在classpath中自动搜索带有annotation的组件。典型的,下列组件类会注解为stereotype: @Component, @Repository, @Service, @Controller. 取决于程序的上下文配置,这些组件会被自动搜索到,并且转变为Spring bean定义,而不需要为每个类都进行明确的配置。

Annotation-driven bean configuration is discussed in Section 3.12.1, “@Component和更多典型化注解”.

Annotation驱动的bean配置在Section 3.12.1, “@Component和更多典型化注解”讨论。

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的AOP支持” 的部分详细描述了该支持的细节。

2.3.2. 对@AspectJ 切面的支持

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

2.3.3. 对bean命名pointcut( bean name pointcut element)的支持

Spring 2.5 加入了对bean(...)pointcut 元素的支持,在 spring定义的bean命名中对指定的命名进行匹配。细节请参阅 Section 6.2.3.1, “切入点指示符(PCD)的支持”

2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持

Spring 2.5支持对AspectJ装载时织入的显式支持,作为基于proxy的AOP框架的补充。新的context:load-time-weaver配置元素自动激活定义在AspectJ的META-INF/aop.xml配置文件中的AspectJ方面,通过在底层ClassLoader中注册的一个转换器,把它们应用于当前应用程序上下文中。注意这仅在支持类转换器(class transformation)的环境中才能运作。 参阅Section 6.8.4, “在Spring应用中使用AspectJ加载时织入(LTW)”,有对其能力和限制的描述。

2.4. 中间层

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

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

Spring 2.5在装载时植入外还支持方便的注解驱动的事务管理,这是通过context:load-time-weavertx:annotation-driven mode="aspectj"的联合使用进行的。

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

2.4.2. 对Websphere 事务管理的完整支持

Spring 2.5 明确支持IBM的WebSphere Application Server,特别是WebSphere's transaction manager. Transaction suspension(事务挂起)现在通过使用WebSphere新的UOWManager API得到了完整支持,此API在on WAS 6.0.2.19+ and 6.0.1.9+ 可用。

因此如果你在WebSphere Application Server中运行基于Spring的应用程序,我们高度建议你使用Spring 2.5的WebSphereUowTransactionManager作为你选择的PlatformTransactionManager。这也是 IBM官方的建议。

要自动探测底层的JTA 事务平台,可以使用Spring 2.5的新 tx:jta-transaction-manager 配置元素。它会自动探测BEA WebLogic和IBM WebSphere,注册正确的PlatformTransactionManager

2.4.3. JPA

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

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

Spring 2.5对OpenJPA的支持升级到了OpenJPA 1.0,支持savepoint这样的高级特性。

2.4.4. 异步的JMS

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

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

在Spring 2.5中, JCA风格的异步消息监听器设置也通过GenericMessageEndpointManager工具得到了支持。这是对标准JMS监听器工具的补充,允许对ActionMQ和JORAM这些消息broker进行更深入的集成。参见Section 19.5, “JCA消息端点的支持”

Spring 2.5 还引入了一个XML namespace来简化JMS配置,可以对大量监听器进行简明配置。这一命名空间支持标准的JMS监听器和JCA setup风格,在配置时只有很小的改变。参阅Section 19.6, “JMS命名空间支持”

2.4.5. JDBC

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

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

Spring 2.5显著的扩充了SimpleJdbcTemplate的功能,引入了SimpleJdbcCallSimpleJdbcInsert操作对象。

2.5. Web层

在Spring 2.0里,web层支持得到了 充分地 改进和扩展,在Spring 2.5中引入了基于注解的controller。

2.5.1. Spring MVC合理的默认值

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

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

2.5.2. Portlet 框架

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

2.5.3. 基于Annotation的控制器

Spring 2.5 为MVC 控制器引入了一种基于Annotation(注解)的编程模型, 使用@RequestMapping, @RequestParam, @ModelAttribute等等注解。 对SevletMVC和PortletMVC来说,注解都是支持的。用这种方式实现的Controller不需要显式继承基类或者声明接口了。更好的是,它们不再需要像通常那样依赖于Servlet或Portlet API,虽然如果需要他们还是可以很容易的访问Servlet或者Portlet工具。 更多细节请参阅 Section 13.12, “基于注解的控制器配置”

2.5.4. 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.5. 对Tiles 2 支持

Spring 2.5 加入了对tiles 2的支持,它是流行的Tiles 模板框架的下一代。它接替了Spring对Tiles 1的正式支持,Strutcs 1.x包含Tiles 1。细节请参阅Section 14.3, “Tiles”

2.5.6. 对JSF 1.2支持

Spring 2.5 支持JSF 1.2,提供了DelegatingVariableResolver的一个变种,以SpringBeanFacesELResolver的形式。

2.5.7. JAX-WS支持

Spring 2.5完全支持JAX-WS 2.0/2.1,它在Java 6和Java EE 5中内置。JAX-WS 是JAX-RPC的后继者,允许访问基于WSDL/SOAP的web service,也可以访问JAX-WS风格暴露的web service。

2.6. 其他

最后这一部分列出所有其他的Spring 2.0/2.5的新功能或改进过的功能。

2.6.1. 动态语言支持

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

Spring 2.5 提高了动态语言支持,加入了autowiring和对刚发布的JRuby 1.0的支持。

2.6.2. 增强的测试支持

Spring 2.5 引入了Spring TestContext Framework, 它提供了注解(annotation)驱动的单元和集成测试支持,它是现存的测试框架的混合。不同的测试框架可以使用同样的技术和基于注解的配置,例如,JUnit 3.8环境也可以用于使用JUnit 4.4或TestNG编写的测试。

除了提供通用并且可扩展的测试基础设备,Spring TestContext Framework提供了可以立刻使用的针对Spring的集成测试功能,例如context management and caching(上下文管理与缓存), dependency injection of test fixtures(测试夹具的DI), 和 transactional test management(事务测试管理) ,使用默认rollback语义。

想知道这些新的测试支持能为你编写单元和集成测试带来多大的好处?请参阅Section 8.3.7, “Spring TestContext Framework”,这是更新过的测试章节。

2.6.3. JMX 支持

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

除此之外,Spring 2.5还提供了context:mbean-export配置元素,便于注册使用注解标注的bean 类,它会检查Spring的@ManagedResource 注解。

2.6.4. 将Spring 应用程序上下文部署为JCA adapter

Spring 2.5支持将Spring应用程序上下文配置成为JCA 资源适配器(JCA resource adapter),打包为JCA RAR文件。这允许孤立的应用程序模块部署进J2EE服务器,访问所有的服务器基础设施,例如执行计划任务,监听消息等等。

2.6.5. 计划任务

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

TaskExecutor抽象层在Spring内部也同样美被使用,例如,异步JMS支持。在Spring 2.5中,在对JCA环境支持中也使用到了。

2.7. 移植到Spring 2.5

最后这部分包含一些细节问题,在你从Spring 1.2/2.0升级到Spring 2.5时可能遇到。

从Spring 2.0.x应用程序升级到Spring 2.5只需要简单的把Spring 2.5的jar复制到你应用程序目录结构中的合适位置即可。我们高度建议任何运行在JDK 1.4.2或更高版本的Spring 2.0应用程序升级到Spring 2.5,特别是运行在Java 5或更高版本上的,Spring 2.5带来了巨大的配置便利和性能提高。

从Spring 1.2.x升级是否平滑取决于你在代码中使用了多少Spring API。Spring 2.0删除了在Spring 1.2.x代码中标注为“deprecated”的绝大部分类和方法,因此如果你使用了这些类或者方法,你当然得使用替代的类和方法(下面有一个列表)。

在配置方面,Spring 1.2.x风格的XML配置是100%信心保证和Spring 2.5兼容的。当然如果你还在使用Spring 1.2.x DTD,你没办法使用一些新的Spring 2.0功能(例如scopeseasier AOPtransaction configuration),但是没有什么会出错。

建议的升级策略是将Spring 2.5 jar放入,以得到新版本的好处(例如bug修正,优化,等等)。然后,以一种循序渐进的方式,开始选择使用新的Spring 2.5功能和配置。例如,你可以开始用新的Spring 2风格来配置你的aspects,完全可以将其中的90%仍然使用老的Spring 1.2.x配置(引用1.2.x DTD),剩下的10%使用新的Spring 2 配置(引用2.0/2.5 DTD或者XSD)。记住,将Spring 2.5类库替换后,你并不是非得升级你的XML配置不可。

2.7.1. 改变

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

2.7.1.1. 支持的JDK版本

Spring 2.5对JDK 1.3已经不再支持,因为Sun官方从2006晚期已经正式将JDK 1.3淘汰。请升级到JDK 1.4.2或更高版本。

如果你必须使用只支持JDK 1.3的应用服务器,例如WebSphere 4.0或5.0,我们建议你使用Spring Framework版本2.0.7/2.0.8,它们仍然支持JDK 1.3。

2.7.1.2. Spring 2.5的Jar打包

在Spring 2.5中, Spring Web MVC 不再是 'spring.jar' 文件的一部分. Spring MVC以'spring-webmvc.jar''spring-webmvc-portlet.jar'文件形式在发行包的 lib/modules 目录中存在。 另外,对Struts 1.x的支持被独立成 'spring-webmvc-struts.jar'

注意: 经常被使用的Spring的DispatcherServlet也是Spring Web MVC框架的一部分。 因此,就算你只是为了远程访问(例如,暴露Hessian或者 HTTP调用服务)而使用DispatcherServlet,你也得将'spring-webmvc.jar'(或者 'spring-webmvc-portlet/struts.jar')放到'spring.jar'旁边去。

Spring 2.0的 'spring-jmx.jar''spring-remoting.jar'已经被转移到 Spring 2.5的'spring-context.jar' (针对 JMX 和非HTTP 远程支持),部分转移到 'spring-web.jar' (针对HTTP 远程支持)。

Spring 2.0的 'spring-support.jar' 被改名为 'spring-context-support.jar', 更好的表达其真实含义。 'spring-portlet.jar' 被改名为 'spring-webmvc-portlet.jar',表明它是Spring Web MVC framework的子模块之一。 类似的, 'spring-struts.jar' 被改为'spring-webmvc-struts.jar'

Spring 2.0的'spring-jdo.jar', 'spring-jpa.jar', 'spring-hibernate3.jar', 'spring-toplink.jar''spring-ibatis.jar' 被合并到Spring 2.5大粒度的'spring-orm.jar'中。

Spring 2.5的 'spring-test.jar' 取代了'spring-mock.jar',表达其对test context framework的强烈关注。 注意 'spring-test.jar' 包含了上个版本 'spring-mock.jar'中的一切,因此如果是单元或集成测试,可以直接取代。

Spring 2.5的 'spring-tx.jar' 取代了 'spring-dao.jar''spring-jca.jar' 文件,表达其对transaction framework的强烈关注。

Spring 2.5 将其jar文件直接作为OSGi兼容的bundle。这使得在OSGi环境中使用Spring 更加方便,不再需要定制打包了。

2.7.1.3. 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.4. Deprecated(淘汰)的类和方法

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

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

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

  • ResultReader : 使用RowMapper接口代替。

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

2.7.1.5. Apache OJB

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

2.7.1.6. iBATIS

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

2.7.1.7. Hibernate

Spring 2.5中,对 Hibernate 2.1 和 Hibernate 3.0 的支持已经去除。请升级到Hibernate 3.1或更高版本。

如果你需要继续使用Hibernate 2.1或3.0,我们建议你继续使用Spring 2.0.7/2.0.8,这些版本仍然支持Hibernate的那些版本。

2.7.1.8. JDO

Spring 2.5中,对JDO 1.0 的支持被去除。请升级到JDO 2.0或更高版本。

如果你需要继续使用JDO 1.0,我们建议你继续使用spring 2.0.7/2.0.8,这些版本仍然支持JDO 1.0。

2.7.1.9. UrlFilenameViewController

从Spring 2.0起,UrlFilenameViewController所决定的view名字现在考虑了request中的嵌套路径。这是对原始 UrlFilenameViewController约定的重大修改,意味着如果你从Spring 1.x升级到Spring 2.x,并且你在使用这个类,你可能必须小小的修改你的Spring Web MVC配置。请参考UrlFilenameViewController 的类Javadoc,来查看新的view name determination的约定的示例。

2.8. 更新的样例应用

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

Spring 2.5 附带有PetClinic和PetPortal的改进过的示例程序,彻底从头改写过,用于展示Spring 2.5的注解配置功能。它也使用了Java 5 autoboxing,泛型,varargs和对循环的强化。必须使用Java 5或者6 SDK才能构建和运行这些示例。查看PetClinic和PetPortal,来让Spring 2.5所提供的功能给你留下深刻印象吧!

2.9. 改进的文档

Spring参考文档理所当然的进行了充分的更新,以反映上述Spring 2.0和2.5的新特性。尽管我们竭尽所能力争这份文档不会出现错误,但是人非圣贤,错误在所难免。 如果您发现了一些打印排版或者更严重的错误,并可以抽出一些空闲时间来的话, 请通过 问题提交 把错误发给Spring团队。

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