Spring框架于2004年首次发布,此后出现了重大的重大修改:Spring 2.0提供了XML名称空间和AspectJ支持;Spring 2.5采用了注解驱动的配置,Spring 3.0在框架代码库中引入了强大的Java 5+基础,以及诸如基于Java的@configuration模型之类的特性。
版本4.0是Spring框架的最新主要版本,也是第一个完全支持Java 8特性的版本,您仍然可以使用Spring的旧版本的Java,然而,现在已经将最低要求提高到Java SE 6,我们还利用了一个主要版本的机会来删除许多已弃用的类和方法。
升级到Spring 4.0的迁移指南可以在Spring框架的GitHub Wiki上获得。
3.1改进了入门经验
新的Spring。io网站提供了一系列的“入门”指南,帮助你学习Spring。你可以在第一章中读到更多关于指南的内容,在本文档中开始使用Spring部分。这个新网站还提供了一个全面的概述,介绍了许多在Spring结构下发布的项目。
如果您是一个Maven用户,您可能也会对现在发布的每个Spring框架发行版的POM文件感兴趣。
3.2删除已弃用的包和方法
所有已弃用的包,以及许多弃用的类和方法在4.0版本中被删除。如果您正在从以前的Spring版本升级,那么您应该确保您已经修复了对过时的api的不支持的调用。
对于所有的变动,请查看API差异报告。
注意,可选的第三方依赖关系已经提高到2011/2011年的最低限度(也就是说,Spring 4通常只支持在2010年末或之后发布的版本);值得注意的是,Hibernate 3.6+、EhCache 2.1+、Quartz 1.8+、Groovy 1.8+和joda-time 2.0+。Spring 4需要最新的Hibernate Validator 4.3+,并且对Jackson的支持已经集中于2.0+(对Jackson1.8/1.9的支持,当时是Spring 3.2所拥有的,现在已经被弃用了)。
3.3 Java 8(以及6和7)
Spring Framework 4.0提供了对几个Java 8特性的支持。您可以使用Spring的回调接口来使用lambda表达式和方法引用。对于java.time (JSR-310)有最好的支持,一些现有的注释已经被改造为@Repeatable。您还可以使用Java 8的参数名称发现(基于-parameters编译器标志)作为启用调试信息的另一种选择。
Spring仍然与旧版本的Java和JDK兼容:具体地说,Java SE 6(特别地,在2010年1月发布的最低的JDK 6更新到18)上面仍然是完全支持的,但是,对基于Spring 4开发的项目,我们建议使用Java 7或8版本。
3.4 Java EE 6 和 7
Java EE版本6或更高版本现在被认为是使用Spring框架4的最基本的标准,JPA 2.0和Servlet 3.0规范具有特殊的相关性。为了与Google App Engine和旧的应用程序服务器保持兼容,可以将Spring 4应用程序部署到Servlet 2.5环境中。然而,强烈建议使用Servlet 3.0+,并且在Spring的测试中,对于开发环境中的测试设置来说,这是一个首要的条件。
如果您是WebSphere 7用户,请确保安装JPA 2.0功能包。在WebLogic 10.3.4或更高版本中,安装与它一起的JPA 2.0补丁。这使得这两种服务器都可以转换为Spring 4兼容的部署环境。
往长远看,Spring Framework 4.0支持Java EE 7级别的适用规范:特别是JMS 2.0、JTA 1.2、JPA 2.1、Bean验证1.1和jsr-236并发实用工具。与往常一样,这种支持侧重于对这些规范的单独使用,例如在Tomcat或独立环境中。但是,当将Spring应用程序部署到Java EE 7服务器时,它的工作方式也同样出色。
请注意,Hibernate 4.3是JPA 2.1的提供者,因此它只支持Spring Framework 4.0。作为Bean Validation 1.1的提供者也是如此。这两个版本都没有得到Spring框架3.2的官方支持。
3.5 Groovy Bean定义DSL
从Spring Framework 4.0开始,可以使用Groovy DSL来定义外部bean配置。在思想上是与相似的但是允许使用更简洁的语法。使用Groovy允许你在bootstrap 代码中直接嵌入bean定义,例如:
|
要了解更多信息,请参阅GroovyBeanDefinitionReader javadocs.
3.6核心容器的改进
核心容器有几个总体改进:
1、Spring现在在注入bean时将泛型类型作为限定符的形式。例如,如果您使用的是Spring Data Repository,那么您现在可以轻松地注入特定的实现:@Autowired Repository<Customer> customerRepository.
2、如果您使用Spring的元注释,您现在可以开发自定义的注释,该注释可以从源注释中公开特定的属性。
3、当这些bean被自动装配到列表和数组时,它们就可以被排序了。都支持@Order注解和Ordered接口。
4、@Lazy注释现在可以在注入点上使用,也可以在@bean定义上使用。
5、对于使用基于java的配置的开发人员,已经介绍了@description注释。
6、通过@Conditional注释添加了有条件过滤bean的通用模型。这类似于@Profile支持但是允许用户自定义编程方式。
7、CGLIB-based代理类不再需要一个默认的构造函数。支持通过objenesis库提供,该库被重新打包,并作为Spring框架的一部分分发。有了这个策略,不再有任何构造函数被用于代理实例的调用。
8、现在在整个框架中都有管理的时区支持,例如在LocaleContext中
3.7常规Web改进
部署到Servlet 2.5服务器仍然是一个选择,但Spring框架4.0现在主要关注于Servlet 3.0+环境。如果您正在使用Spring MVC测试框架,您将需要确保Servlet 3.0兼容JAR在您的测试类路径中。
除了后来提到的WebSocket支持之外,对Spring的Web模块进行了以下的全面改进:
1、您可以使用新的@restcontroller注释来使用Spring MVC应用程序,从而消除了将@responsebody添加到每个@requestmapping方法的需要。
2、添加了AsyncRestTemplate类,在开发REST客户端时允许非阻塞异步支持。
3、Spring现在在开发Spring MVC应用程序时提供了全面的时区支持。
3.8 WebSocket,SockJS和STOMP Messaging
一个新的spring websocket模块为web应用程序中的客户端和服务器之间的基于web的双向通信提供了全面的支持。它兼容jsr-356,Java WebSocket API,并且提供了基于sockjs的回退选项(即WebSocket仿真),用于在不支持WebSocket协议的浏览器中使用(例如Internet Explorer小于10的版本)。
一个新的spring-messaging模块添加了对STOMP的支持,这是在应用程序中使用的WebSocket子协议,以及一个用于从WebSocket客户端路由和处理STOMP消息的注释编程模型。因此,@controller现在可以同时包含@RequestMapping和@MessageMapping方法,用于处理来自网络连接的客户机的HTTP请求和消息。新的spring-messaging模块还包含了以前从Spring Integration项目中提取的关键抽象,比如Message, MessageChannel, MessageHandler等,作为基于消息应用程序的基础。
要了解更多细节,包括更全面的介绍,请参阅第25章“WebSocket支持”一节。
3.9测试改进
除了在spring-test模块中对已废弃的代码进行整理之外,Spring Framework 4.0还引入了一些用于单元和集成测试的新特性。
1、几乎所有的注解都可用在spring-test模块中(如:@ContextConfiguration, @WebAppConfiguration, @ContextHierarchy, @ActiveProfiles等。),现在可以作为元注解来创建定制的自定义复合注释,并在测试中减少重复配置。
2、现在,通过实现一个定制的activepro文件解析器并通过@activeprofiles的解析器属性来注册它,可以通过编程方式解决活动bean定义概要文件。
3、在spring核心模块中引入了一个新的SocketUtils类,它允许您在本地主机上扫描免费的TCP和UDP服务器端口。这一功能并不是特定于测试的,但在编写需要使用套接字的集成测试时,可以证明非常有用,例如启动内存中的SMTP服务器、FTP服务器、Servlet容器等的测试。
4、在Spring 4.0中,org.springframework.mock.web包现在是基于Servlet 3.0 API的。此外,还有几个Servlet API模拟(例如:MockHttpServletRequest, MockServletContextt等)更新了一些小的改进和改进的可配置性。