如果你已经用了一段时间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。
Spring 2.0 相当大的改进之一就是Spring的IoC容器。
多亏了新的基于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">
Spring上个版本的IoC容器支持两个不同的bean作用域(单例与原型)。Spring 2.0改进了这一点,不仅提供了一些依赖于Spring部署环境(比如说,在web环境中的request和session作用域bean)的额外的作用域,而且提供了所谓的'钩子'('hooks')(因为找不到更好的表达)使Spring用户可以创造自己的作用域。
应该注意的是,即使单例与原型作用域beans的基本(内在)实现发生了变化,上述变化对最终用户来说是透明的...现有的配置不需要改变或放弃。
在标题为 Section 3.4, “bean的作用域” 的部分有对新增的作用域与原有作用域的详细描述。
XML配置不仅更加易于书写,而且也具有可扩展性。
这里'可扩展性'的含义是,作为一个应用程序开发人员,或着(更可能)作为第三方框架或产品的供应商,可以开发自定义标签,供其他开发人员把这些标签嵌入到自己的Spring配置文件里。你可以在组件的特定配置中定义你自己的DSL(domain specific language,这个词在这里用得比较宽泛)。
对于个别应用的开发人员或者在项目中运用Spring的企业架构师来说,实现自定义Spring标签可能不是他们的兴趣所在。我们期待着第三方供应商能够对开发在Spring配置文件里使用的自定义配置标签予于足够的关注。
可扩展的配置机制在 Appendix B, Extensible XML authoring 里有更充分的描述。
Spring 2.0在AOP上有很大的改进。Spring AOP框架本身就十分易于用XML配置,不再那么繁琐;Spring 2.0集成了AspectJ 切入点(pointcut)语言和 @AspectJ 切面(aspect)声明类型。 标题为 Chapter 6, 使用Spring进行面向切面编程(AOP) 的部分专门描述这个新支持。
Spring 2.0引入了新的模式,支持定义从常规Java对象中发展中来的切面。 此支持充分利用了AspectJ切入点语言,提供了完整类型的通知(advice)(也就是没有多余转换和 Object[] 参数操作)。 标题为 Section 6.3, “Schema-based AOP support” 的部分详细描述了该支持的细节。
Spring 2.0也支持使用@AspectJ注解定义的切面。这些切面可以在AspectJ与Spring AOP中共享,仅仅需要(老实说!)一些简单的配置。 在标题为 Section 6.2, “@AspectJ支持” 的部分讨论了对@AspectJ切面的支持。
Spring 2.0关于事务的配置方式发生了重大的变化。早先的1.2.x版本的配置方式仍然有效(并且受支持),但是新的方式明显更加简洁,并成为最推荐的方式。 Spring 2.0 同时提供了AspectJ切面库,你可以使用它来生成更漂亮的事务性对象 - 甚至可以不是由Spring IoC容器产生的。
标题为 Chapter 9, 事务管理 的部分包含所有的细节。
Spring 2.0提供了JPA抽象层,在所起的作用与常规使用模式上,类似于Spring的JDBC抽象层。
如果你对使用实现JPA作为自己持久层的基础感兴趣,标题为 Section 12.6, “JPA” 的部分专门描述了在这个领域Spring的支持与附加值。
在Spring 2.0之前,Spring的JMS的作用局限于发送消息和同步接收消息。 这个功能(封装在 JmsTemplate 类中)当然是很好的, 但是,它没有满足异步消息接收的需要。
Spring 2.0现在提供对异步消息接收的完整支持。在标题为 Section 19.4.2, “异步接收 - 消息驱动的POJOs” 的部分有详细的描述。
在Spring的JDBC支持库中,有几个小的(但同样值得注意的)新类。首先,NamedParameterJdbcTemplate, 提供了在编写JDBC语句时,对使用命名参数(与之相对的是编写JDBC语句时只使用常规的占位符('?'))的支持。
另一个新类,SimpleJdbcTemplate, 致力于在使用Java 5+ (Tiger)开发时更加简单地使用JdbcTemplate。
在Spring 2.0里,web层支持得到了 充分地 改进和扩展。
Spring MVC丰富的JSP标签库 来自 JIRA,其中的绝大部分是Spring用户(范围很广的用户)通过投票方式产生的。
Spring 2.0拥有一个丰富的JSP标签库,在使用Spring MVC时,编写JSP页面变得更加简单;Spring团队自信地认为它将满足所有在JIRA上投票的开发人员的需要。在标题为 Section 13.9, “使用Spring的表单标签库” 的部分描述了新的标签库,标题为 Appendix E, spring-form.tld 的附录部分是对所有新标签的快速指南。
对于很多项目而言,遵守建立好的规范,使用合理的默认值,是项目所必须的... 现在在SpringMVC里,惯例优先(convention-over-configuration)的观点有了明确的支持。 这就意味着当你为控制器和视图建立一系列的命名规范时,你可以 充分 减少XML配置的数量,包括设置处理映射、视图解析、ModelAndView的实例等等。 对于开发快速原型来说,这有非常大的优势,并且越过代码库可以产生一定的连续性(通常是良好的)。
在标题为 Section 13.11, “惯例优先原则(convention over configuration)” 的部分,可以发现对Spring MVC的惯例优先支持的详细内容。
Spring 2.0 设计了一种概念上类似于Spring MVC框架的Porlet框架。标题为 Chapter 16, Portlet MVC框架 的部分可以找到详细的介绍。
最后部分罗列了所有其他关于Spring 2.0的新特性与改进特性。
Spring 2.0现在支持用非Java语言编写的bean,当前支持的动态语言包括JRuby,Groovy和BeanShell。标题为 Chapter 24, 动态语言支持 部分描述了动态语言支持的细节。
Spring Framework开始支持通知(Notification); 还可以声明式地控制MBean在一个MBeanServer上的注册行为。
关于任务规划,Spring 2.0 提供了一种抽象。对于感兴趣的开发人员,标题为 Section 23.4, “SpringTaskExecutor抽象” 的部分提供了所有的细节。
如果你有幸使用Java 5(Tiger)进行项目开发,你将很高兴地发现,Spring 2.0对于Tiger有一些非常引人注目的支持。下面是一系列Spring Java 5 独有特性的指南
最后一节中详细说明了从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配置。
如需了解全部变化,请参考Spring Framework 2.0发布包顶层目录里的'changelog.txt'文件。
1.2.x和2.0的Spring Framework jar文件有很多不同之处。 特别是现在JDO、Hibernate 2/3、TopLink的ORM集成类有专门的jar文件:它们不再被打包在核心文件 'spring.jar'中了。
Spring 2.0的XSD在描述Spring XML元数据格式方面比先前的DTD更丰富。 旧的DTD仍然得到支持,但如果可能我们鼓励在bean定义文件头部引用XSD文件。
有一点被改变了,那就是定义bean作用域的方式。如果你使用的是Spring 1.2 DTD,那么你能继续用'singleton'属性。 如果你选择引用新的Spring 2.0 DTD,它不允许使用'singleton'属性, 那么可以用'scope'属性来定义bean的生命周期作用域。
一些以前被标记为@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代替
请注意Spring主代码中的Apache OJB支持被完全删除了; 但仍然可以在Spring Modules项目中找到Apache OJB的集成库。
我们同样更新了一些样例应用以反映Spring 2.0的新特性与改进特性,请抽出时间仔细研究。 上述样例放在Spring完整发行版里的'samples'路径下 ('spring-with-dependecies.[zip|tar.gz]')。
上述发行版同时提供了一些所谓的体现特性优势的应用。每个应用都提供了完整的例子,一次演示一个Spring 2.0的新特性。 这意味着你可以在这些应用中运行代码,而不需再自己创建小工程测试Spring 2.0的新特性。我们故意将这些应用的作用域设定的很小; 作用域模型(如果有的话)可能只有一两个类,而典型的企业关注点,如安全和事务完整性,显然没有包含在内。
Spring参考文档理所当然的进行了充分的更新,以反映上述Spring 2.0的新特性。
尽管我们竭尽所能立争这份文档不会出现错误,但是人非圣贤,错误在所难免。 如果您发现了一些打印排版或者更严重的错误,并可以抽出一些空闲时间来的话, 请通过 问题提交 把错误发给Spring团队。
特别感谢Arthur Loder,谢谢他不辞辛劳地校对Spring Framework的参考文档和Javadocs。