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

Spring Framework 于 2004 年首次发布;从那以后出现了重大的重大修改:Spring 2.0 提供了 XML 命名空间和 AspectJ 支持; Spring 2.5 拥抱 annotation-driven configuration; Spring 3.0 在 framework 代码库中引入了强大的 Java 5 基础,并在 Java-based @Configuration model 中引入了 features。

Version 4.0 是 Spring Framework 的最新主要版本,也是第一个完全支持 Java 8 features 的版本。您仍然可以将 Spring 与旧版本的 Java 一起使用,但是,现在已将最低要求提升到 Java SE 6.我们还利用主要版本的机会删除了许多已弃用的 classes 和方法。

Spring Framework GitHub Wiki上有迁移指南升级到 Spring 4.0

3.1 改进了入门体验

新的spring.io网站提供了一整套“入门” guides 来帮助您学习 Spring。您可以在本文档的第 1 章,Spring 入门部分中阅读有关 guides 的更多信息。新网站还全面概述了在 Spring 保护伞下发布的许多其他项目。

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

3.2 删除了不推荐使用的包和方法

所有已弃用的软件包以及许多已弃用的 classes 和方法都已使用 version 4.0 删除。如果要从以前版本的 Spring 升级,则应确保已修复过时的 API 已过时的已调用的 calls。

如需完整的更改,请查看API 差异报告

请注意,可选的 third-party 依赖项已被提升到 2010/2011 最小值(i.e .Spring 4 通常仅支持 2010 年末或更晚版本发布的版本):值得注意的是,Hibernate 3.6,EhCache 2.1,Quartz 1.8,Groovy 1.8 和 Joda-Time 2.0. 作为规则的 exception,Spring 4 需要最近的 Hibernate Validator 4.3,并且 Jackson 的支持现在已经集中在 2.0 上(@ @

3.3 Java 8(以及 6 和 7)

Spring Framework 4.0 支持多个 Java 8 features。您可以在 Spring 的回调接口中使用 lambda 表达式和方法 references。对java.time(JSR-310)有 first-class 支持,并且几个现有的注释已被改装为@Repeatable。您还可以使用 Java 8 的参数 name discovery(基于-parameters编译器 flag)作为在启用调试信息的情况下编译 code 的替代方法。

Spring 仍然与旧版 Java 和 JDK 兼容:具体而言,仍然完全支持 Java SE 6(具体而言,相当于 JDK 6 更新 18 的最低等级,如 2010 年 1 月发布)及更高版本。但是,对于基于 Spring 4 的新开始的开发项目,我们建议使用 Java 7 或 8。

截至 2017 年底,JDK 6 正在逐步淘汰,因此也是 Spring 的 JDK 6 支持。 Oracle 和 IBM 将在 2018 年终止 JDK 6 的所有商业支持工作。虽然 Spring 将保留其整个 4.3.x line 的 JDK 6 运行时兼容性,但我们需要升级到 JDK 7 或更高版本以获得超出此要求的任何进一步支持:特别是对于 JDK 6 特定的错误修复或升级到 JDK 7 解决问题的其他问题。

3.4 Java EE 6 和 7

Java EE version 6 或更高版本现在被认为是 Spring Framework 4 的基线,JPA 2.0 和 Servlet 3.0 规范特别相关。为了与 Google App Engine 和旧的 application 服务器保持兼容,可以将 Spring 4 application 部署到 Servlet 2.5 环境中。但是,强烈建议使用 Servlet 3.0,这是 Spring 的 test 和 mock 包中的先决条件,用于开发环境中的测试设置。

如果您是 WebSphere 7 用户,请确保安装 JPA 2.0 feature 包。在 WebLogic 10.3.4 或更高版本上,安装随附的 JPA 2.0 补丁。这将这两代服务器转变为 Spring 4 兼容的部署环境。

更多 forward-looking 注释,Spring Framework 4.0 现在支持适用规范的 Java EE 7 level:特别是 JMS 2.0,JTA 1.2,JPA 2.1,Bean Validation 1.1 和 JSR-236 Concurrency Utilities。像往常一样,这种支持侧重于个人使用这些规范,e.g. 在 Tomcat 或独立环境中。但是,当 Spring application 部署到 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 configuration。这在概念上类似于使用 XML bean 定义,但允许更简洁的语法。使用 Groovy 还允许您直接在引导程序 code 中嵌入 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 javadoc

3.6 核心容器改进

核心容器有一些一般的改进:

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

  • 如果您使用 Spring 的 meta-annotation 支持,您现在可以开发从源 annotation 中公开特定属性的自定义注释。

  • Beans 现在可以在自动装入 lists 和数组时订购。支持@Order annotation 和Ordered接口。

  • @Lazy annotation 现在可用于注入点以及@Bean定义。

  • @Description annotation 已被引入适用于使用 Java-based configuration 的开发人员。

  • 通过@Conditional annotation 添加了有条件地过滤 beans的通用 model。这类似于@Profile支持,但允许以编程方式开发 user-defined 策略。

  • CGLIB-based 代理 classes不再需要默认构造函数。通过objenesis library 提供支持,该列表在内部重新打包并作为 Spring Framework 的一部分进行分发。使用此策略,根本不再为代理实例调用构造函数。

  • 现在,整个 framework 都有 time zone 支持,e.g. 在LocaleContext

3.7 一般 Web 改进

部署到 Servlet 2.5 服务器仍然是一个选项,但 Spring Framework 4.0 现在主要关注 Servlet 3.0 环境。如果您使用的是Spring MVC Test Framework,则需要确保 Servlet 3.0 兼容的 JAR 位于 test classpath 中。

除了后面提到的 WebSocket 支持之外,对 Spring 的 Web 模块进行了以下一般性改进:

3.8 WebSocket,SockJS 和 STOMP Messaging

新的spring-websocket模块为 web applications 中 client 和 server 之间的 WebSocket-based,two-way 通信提供全面支持。它与JSR-356,Java WebSocket API 兼容,另外还提供了 SockJS-based fallback 选项(i.e.WebSocket 仿真),用于尚不支持 WebSocket 协议的浏览器(e.g. Internet Explorer <10)。

新的spring-messaging模块添加了对 STOMP 的支持,作为要在 applications 中使用的 WebSocket sub-protocol 以及 annotation 编程 model,用于路由和处理来自 WebSocket clients 的 STOMP 消息。因此,@Controller现在可以包含@RequestMapping@MessageMapping方法,用于处理来自 WebSocket-connected clients 的 HTTP 请求和消息。新的spring-messaging模块还包含以前来自Spring Integration项目的 key 抽象,例如MessageMessageChannelMessageHandler等,以作为 messaging-based applications 的基础。

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

3.9 测试改进

除了在spring-test模块中修剪已弃用的 code 之外,Spring Framework 4.0 还引入了几个新的 features,用于单元和 integration 测试。

  • spring-test模块中几乎所有 annotations(e.g. ,@ContextConfiguration@WebAppConfiguration@ContextHierarchy@ActiveProfiles,etc.)现在可以用作meta-annotations来创建自定义组合注释并减少测试套件中的配置重复。

  • Active bean 定义 profiles 现在可以通过编程方式解析,只需实现自定义ActiveProfilesResolver并通过@ActiveProfilesresolver属性注册即可。

  • spring-core模块中引入了一个新的SocketUtils class,使您可以扫描 localhost 上的空闲 TCP 和 UDP 服务器端口。此功能并非特定于测试,但在编写需要使用套接字的 integration 测试时,非常有用,用于启动 in-memory SMTP 服务器,FTP 服务器,Servlet 容器等的 example 测试。

  • 从 Spring 4.0 开始,org.springframework.mock.web包中的模拟集现在基于 Servlet 3.0 API。此外,一些 Servlet API 模拟(e.g. ,MockHttpServletRequestMockServletContext,etc.)已经更新,具有微小的增强功能和改进的可配置性。