3. Spring Framework 4.0 中的新功能和增强功能

Spring 框架于 2004 年首次发布。从那时起,已经进行了重大的重大修订:Spring 2.0 提供了 XML 名称空间和 AspectJ 支持。 Spring 2.5 包含了 Comments 驱动的配置; Spring 3.0 在整个框架代码库中引入了强大的 Java 5 基础,并提供了基于 Java 的@Configuration模型等功能。

版本 4.0 是 Spring Framework 的最新主要版本,也是第一个完全支持 Java 8 功能的版本。您仍然可以将 Spring 与旧版 Java 一起使用,但是,最低要求现已提高到 Java SE6.我们还利用主要版本的机会删除了许多不赞成使用的类和方法。

升级到 Spring 4.0 的迁移指南Spring 框架 GitHub Wiki上可用。

3.1 改进的入门经验

新的spring.io网站提供了一系列完整的"Getting Started"指南,以帮助您学习 Spring。您可以在本文档的第 1 章,Spring 入门部分中阅读有关指南的更多信息。新网站还提供了在 Spring 框架下发布的许多其他项目的全面概述。

如果您是 Maven 用户,则可能对现在随每个 Spring Framework 版本发布的有用的材料 Lists POM 文件感兴趣。

3.2 删除了不赞成使用的包和方法

版本 4.0 已删除所有不推荐使用的程序包以及许多不推荐使用的类和方法。如果要从 Spring 的早期版本升级,则应确保已修复了对过时的 API 进行的所有不推荐使用的调用。

要获取完整的更改集,请查看API 差异报告

请注意,可选的第三方依赖项已提高到 2010/2011 的最低要求(即,Spring 4 通常仅支持 2010 年末或现在发布的版本):尤其是 Hibernate 3.6,EhCache 2.1,Quartz 1.8,Groovy 1.8 和 Joda-时间 2.0. 作为规则的 exception,Spring 4 需要最新的 Hibernate Validator 4.3,并且对 Jackson 的支持现在集中在 2.0 上(暂时保留了 Spring 3.2 所具有的 Jackson 1.8/1.9 支持;现在只是不推荐使用的形式) 。

3.3 Java 8(以及 6 和 7)

Spring Framework 4.0 支持多种 Java 8 功能。您可以在 Spring 的回调接口中使用* lambda 表达式方法引用*。对java.time(JSR-310)有一流的支持,并且几个现有的 Comments 已改型为@Repeatable。您还可以使用 Java 8 的参数名称发现(基于-parameters编译器标志)代替启用调试信息的代码编译。

Spring 仍与 Java 和 JDK 的较早版本兼容:具体而言,仍完全支持 Java SE 6(特别是最低级别,等同于 JDK 6 update 18(于 2010 年 1 月发布))。但是,对于基于 Spring 4 的新开始的开发项目,我们建议使用 Java 7 或 8.

Note

截至 2017 年底,JDK 6 已被淘汰,因此 Spring 也支持 JDK 6. Oracle 和 IBM 将在 2018 年终止对 JDK 6 的所有商业支持。Spring 将保留其对整个 4.3.x 产品线的 JDK 6 运行时兼容性,但我们需要升级到 JDK 7 或更高版本,以获取更多支持。 :特别是对于 JDK 6 的特定错误修复或其他问题,其中升级到 JDK 7 可以解决该问题。

3.4 Java EE 6 和 7

现在,Java EE 6 或更高版本被视为 Spring Framework 4 的基线,其中特别重要的是 JPA 2.0 和 Servlet 3.0 规范。为了与 Google App Engine 和较旧的应用程序服务器保持兼容,可以将 Spring 4 应用程序部署到 Servlet 2.5 环境中。但是,强烈建议使用 Servlet 3.0,它是 Spring 的测试和模拟包中用于开发环境中测试设置的先决条件。

Note

如果您是 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 Validation 1.1 和 JSR-236 并发 Util。与往常一样,此支持侧重于这些规范的个别使用,例如在 Tomcat 或独立环境中。但是,当将 Spring 应用程序部署到 Java EE 7 服务器时,它同样可以很好地工作。

请注意,Hibernate 4.3 是 JPA 2.1 提供程序,因此从 Spring Framework 4.0 开始仅受支持。同样适用于 Hibernate Validator 5.0 作为 Bean Validation 1.1 提供程序。 Spring Framework 3.2 均未正式支持这两者。

3.5 Groovy Bean 定义 DSL

从 Spring Framework 4.0 开始,可以使用 Groovy DSL 定义外部 bean 配置。这在概念上与使用 XML bean 定义相似,但是允许使用更简洁的语法。使用 Groovy 还可以使您轻松地将 bean 定义直接嵌入到引导代码中。例如:

def reader = new GroovyBeanDefinitionReader(myApplicationContext)
reader.beans {
    dataSource(BasicDataSource) {
        driverClassName = "org.hsqldb.jdbcDriver"
        url = "jdbc:hsqldb:mem:grailsDB"
        username = "sa"
        password = ""
        settings = [mynew:"setting"]
    }
    sessionFactory(SessionFactory) {
        dataSource = dataSource
    }
    myService(MyService) {
        nestedBean = { AnotherBean bean ->
            dataSource = dataSource
        }
    }
}

有关更多信息,请咨询GroovyBeanDefinitionReader javadocs

3.6 核心容器的改进

核心容器已进行了几项常规改进:

  • 现在,Spring 在注入 Bean 时会处理泛型类型作为限定符的一种形式。例如,如果您使用的是 Spring Data Repository,则现在可以轻松注入特定的实现:@Autowired Repository<Customer> customerRepository

  • 如果使用 Spring 的元 Comments 支持,现在可以开发公开源 Comments 中的特定属性的自定义 Comments。

  • 现在,可以将 Bean 自动连接到列表和数组进行“排序”。同时支持@OrderComments 和Ordered接口。

  • 现在可以在注入点和@Bean定义上使用@Lazy注解。

  • 使用基于 Java 的配置的开发人员的@DescriptionComments 已引入

  • 有条件地过滤 bean的通用模型已通过@ConditionalComments 添加。这类似于@Profile支持,但允许以编程方式开发用户定义的策略。

  • 基于 CGLIB 的代理类不再需要默认的构造函数。通过objenesis库提供了支持,该库被重新包装为 inline *,并作为 Spring Framework 的一部分进行分发。通过这种策略,不再为代理实例调用任何构造函数。

  • 现在,整个框架都提供托管时区支持,例如在LocaleContext

3.7 常规 Web 改进

仍然可以选择部署到 Servlet 2.5 服务器,但是 Spring Framework 4.0 现在主要集中在 Servlet 3.0 环境。如果您使用的是Spring MVC 测试框架,则需要确保* test classpath *中包含与 Servlet 3.0 兼容的 JAR。

除了后面提到的 WebSocket 支持之外,Spring 的 Web 模块还进行了以下常规改进:

3.8 WebSocket,SockJS 和 STOMP 消息传递

新的spring-websocket模块为 Web 应用程序中 Client 端和服务器之间基于 WebSocket 的双向通信提供了全面的支持。它与 Java WebSocket API JSR-356兼容,此外还提供了基于 SockJS 的后备选项(即 WebSocket 仿真),可用于尚不支持 WebSocket 协议(例如 Internet Explorer <10)的浏览器。

新的spring-messaging模块增加了对 STOMP 的支持,作为 WebSocket 子协议在应用程序中使用,还带有 Comments 编程模型,用于路由和处理来自 WebSocketClient 端的 STOMP 消息。结果,@Controller现在可以同时包含@RequestMapping@MessageMapping方法,用于处理来自连接 WebSocket 的 Client 端的 HTTP 请求和消息。新的spring-messaging模块还包含以前来自Spring Integration项目的关键抽象,例如MessageMessageChannelMessageHandler等,它们是基于消息的应用程序的基础。

有关更多详细信息,包括更全面的介绍,请参见第 26 章,WebSocket 支持部分。

3.9 测试改进

除了修剪spring-test模块中已弃用的代码外,Spring Framework 4.0 还引入了一些新功能,可用于单元和集成测试。

  • 现在,spring-test模块中几乎所有的 Comments(例如@ContextConfiguration@WebAppConfiguration@ContextHierarchy@ActiveProfiles等)都可以用作meta-annotations来创建自定义的组合 Comments,并减少整个测试套件中的配置重复项。

  • 现在,只需通过实现自定义ActiveProfilesResolver并通过@ActiveProfilesresolver属性对其进行注册,就可以以编程方式解析活动 bean 定义概要文件。

  • spring-core模块中引入了新的SocketUtils类,使您可以在 localhost 上扫描免费的 TCP 和 UDP 服务器端口。此功能不是特定于测试的,但在编写要求使用套接字的集成测试(例如,启动内存中的 SMTP 服务器,FTP 服务器,Servlet 容器等的测试)时,会证明非常有用。

  • 从 Spring 4.0 开始,org.springframework.mock.web包中的模拟集现在基于 Servlet 3.0 API。此外,一些 Servlet API 模拟(例如MockHttpServletRequestMockServletContext等)已进行了较小的增强和改进了可配置性。