spring5新特性全面介绍

前方:对于很多开发人员来说,目前大都还在使用spring4的时候,而spring5早已经发布。虽然你可能暂时还没有使用到spring5,但还是需要对其有个大概的了解。

Spring 5 于 2017 年 9 月发布了通用版本 (GA),它标志着自 2013 年 12 月以来第一个主要 Spring Framework 版本。它提供了一些人们期待已久的改进,还采用了一种全新的编程范例,以反应式宣言中陈述的反应式原则为基础。

这个版本是很长时间以来最令人兴奋的 Spring Framework 版本。Spring 5 兼容 Java?8 和 JDK 9,它集成了反应式流,以便提供一种颠覆性方法来实现端点和 Web 应用程序开发。

诚然,反应式编程不仅是此版本的主题,还是令许多开发人员激动不已的重大特性。人们对能够针对负载波动进行无缝扩展的灾备和响应式服务的需求在不断增加,Spring 5 很好地满足了这一需求。

我还会简要介绍测试和性能增强,最后介绍对 Spring 核心和容器的一般性修订。

升级到 Java SE 8 和 Java EE 7

直到现在,Spring Framework 仍支持一些弃用的 Java 版本,但 Spring 5 已从旧包袱中解放出来。为了充分利用 Java 8 特性,它的代码库已进行了改进,而且该框架要求将 Java 8 作为最低的 JDK 版本。

Spring 5 在类路径(和模块路径)上完全兼容 Java 9,而且它通过了 JDK 9 测试套件的测试。对 Java 9 爱好者而言,这是一条好消息,因为在 Java 9 发布后,Spring 能立即使用它。

在 API 级别上,Spring 5 兼容 Java EE 8 技术,满足对 Servlet 4.0、Bean Validation 2.0 和全新的 JSON Binding API 的需求。对 Java EE API 的最低要求为 V7,该版本引入了针对 Servlet、JPA 和 Bean Validation API 的次要版本。

反应式编程模型

Spring 5 最令人兴奋的新特性是它的反应式编程模型。Spring 5 Framework 基于一种反应式基础而构建,而且是完全异步和非阻塞的。只需少量的线程,新的事件循环执行模型就可以垂直扩展。

该框架采用反应式流来提供在反应式组件中传播负压的机制。负压是一个确保来自多个生产者的数据不会让使用者不堪重负的概念。

Spring WebFlux 是 Spring 5 的反应式核心,它为开发人员提供了两种为 Spring Web 编程而设计的编程模型:一种基于注解的模型和 Functional Web Framework (WebFlux.fn)。

基于注解的模型是 Spring WebMVC 的现代替代方案,该模型基于反应式基础而构建,而 Functional Web Framework 是基于 @Controller 注解的编程模型的替代方案。这些模型都通过同一种反应式基础来运行,后者调整非阻塞 HTTP 来适应反应式流 API。

使用注解进行编程

WebMVC 程序员应该对 Spring 5 的基于注解的编程模型非常熟悉。Spring 5 调整了 WebMVC 的@Controller 编程模型,采用了相同的注解。

在清单 1 中,BookController 类提供了两个方法,分别响应针对某个图书列表的 HTTP 请求,以及针对具有给定 id 的图书的 HTTP 请求。请注意 resource 方法返回的对象(Mono 和 Flux)。这些对象是实现反应式流规范中的 Publisher 接口的反应式类型。它们的职责是处理数据流。Mono 对象处理一个仅含 1 个元素的流,而 Flux 表示一个包含 N 个元素的流。

清单 1. 反应式控制器

@RestController

public class BookController {

@GetMapping("/book")
Flux<Book> list() {
return this.repository.findAll();
}

@GetMapping("/book/{id}")
Mono<Book> findById(@PathVariable String id) {
return this.repository.findOne(id);
}

// Plumbing code omitted for brevity
}

这是针对 Spring Web 编程的注解。现在我们使用函数式 Web 框架来解决同一个问题。

函数式编程

Spring 5 的新函数式方法将请求委托给处理函数,这些函数接受一个服务器请求实例并返回一种反应式类型。清单 2 演示了这一过程,其中 listBook 和 getBook 方法类似于清单 1 中的功能。

清单 2. 清单 2.BookHandler 函数类

public class BookHandler {

public Mono<ServerResponse> listBooks(ServerRequest request) {
return ServerResponse.ok()
.contentType(APPLICATION_JSON)
.body(repository.allPeople(), Book.class);
}

public Mono<ServerResponse> getBook(ServerRequest request) {
return repository.getBook(request.pathVariable("id"))
.then(book -> ServerResponse.ok()
.contentType(APPLICATION_JSON)
.body(fromObject(book)))
.otherwiseIfEmpty(ServerResponse.notFound().build());
}
// Plumbing code omitted for brevity
}

spring5新特性全面介绍

扫一扫手机访问