目录
11 Spring5新特性
Pt1 升级到Java SE 8 和Java EE 7
Pt2 反应式编程模型
Pt3 支持函数式编程
Pt4 对HTTP/2 支持
Pt5 Kotlin 和Spring WebFlux
Pt6 使用Lambda 表达式注册Bean
Pt7 包清理和弃用
Pt8 使用JUnit 5 执行条件和并发测试
参考资料
Spring 5 于2017 年9 月发布了通用版本(GA),它标志着自2013 年12 月以来第一个主要Spring Framework 版本。它提供了一些人们期待已久的改进,还采用了一种全新的编程范例,以反应式描述中陈述的反应式原则为基础。
以前的Spring Framework 中一直在支持一些弃用的Java 版本,而Spring 5 已从旧包袱中解放出来。为了充分利用Java 8 特性,它的代码库已进行了改进,而且该框架要求将Java 8 作为最低的JDK版本。
Spring 5 最令人兴奋的新特性是它的反应式编程模型。Spring 5 Framework 基于一种反应式基础而构建,而且是完全异步和非阻塞的。只需少量的线程,新的事件循环执行模型就可以垂直扩展。该框架采用反应式流来提供在反应式组件中传播负压的机制。负压是一个确保来自多个生产者的数据不会让使用者不堪重负的概念。
Spring WebFlux 是Spring 5 的反应式核心,它为开发人员提供了两种为Spring Web 编程而设计的编程模型:一种基于注解的模型和Functional Web Framework (WebFlux.fn)。
基于注解的模型是Spring WebMVC 的现代替代方案,该模型基于反应式基础而构建,而FunctionalWeb Framework是基于@Controller注解的编程模型的替代方案。这些模型都通过同一种反应式基础来运行,后者调整非阻塞HTTP 来适应反应式流API。
Spring 5 的新函数式方法将请求委托给处理函数,这些函数接受一个服务器请求实例并返回一种反应式类型。来看一段代码,创建BookHandler 类,其中listBook() 和getBook() 方法相当于Controller中的功能。
public class BookHandler {
public Mono listBooks(ServerRequest request) {
return ServerResponse.ok()
.contentType(APPLICATION_JSON)
.body(repository.allPeople(), Book.class);
}
public Mono getBook(ServerRequest request) {
return repository.getBook(request.pathVariable("id"))
.then(book -> ServerResponse.ok()
.contentType(APPLICATION_JSON)
.body(fromObject(book)))
.otherwiseIfEmpty(ServerResponse.notFound().build());
}
}
通过路由函数来匹配HTTP 请求参数与媒体类型,将客户端请求路由到处理函数。下面的代码展示了图书资源端点URI 将调用委托给合适的处理函数:
BookHandler handler = new BookHandler();
RouterFunction personRoute =
route(
GET("/books/{id}")
.and(accept(APPLICATION_JSON)), handler::getBook)
.andRoute(
GET("/books")
.and(accept(APPLICATION_JSON)), handler::listBooks);
这些示例背后的数据存储库也支持完整的反应式体验,该体验是通过Spring Data 对反应式Couchbase、Reactive MongoDB 和Cassandra 的支持来实现的。
HTTP/2提高了传输性能,减少延迟,并帮助提高应用程序吞吐量,从而提供经过改进的丰富Web 体验。
Spring Framework 5.0 提供专门的HTTP/2 特性支持,还支持人们期望出现在JDK 9 中的新HTTP客户端。尽管HTTP/2 的服务器推送功能已通过Jetty Servlet 引擎的ServerPushFilter 类向Spring 开发人员公开了很长一段时间,但如果发现Spring 5 中开箱即用地提供了HTTP/2 性能增强,Web优化者们一定会为此欢呼雀跃。
Servlet 4.0 支持在Spring 5.1 中提供。到那时,HTTP/2 新特性将由Tomcat 9.0、Jetty 9.3 和Undertow 1.4 原生提供。
Kotlin 是一种来自JetBrains 的面向对象的语言,它支持函数式编程。它的主要优势之一是与Java 有非常高的互操作性。通过引入对Kotlin 的专门支持,Spring 在V5 中全面吸纳了这一优势。它的函数式编程风格与Spring WebFlux 模块完美匹配,它的新路由DSL 利用了函数式Web 框架以及干 净且符合语言习惯的代码。可以像下面代码中这样简单地表达端点路由:
// Kotlin 的用于定义端点的路由DSL
@Bean
fun apiRouter() = router {
(accept(APPLICATION_JSON) and "/api").nest {
"/book".nest {
GET("/", bookHandler::findAll)
GET("/{id}", bookHandler::findOne)
}
"/video".nest {
GET("/", videoHandler::findAll)
GET("/{genre}", videoHandler::findByGenre)
}
}
}
使用Kotlin 1.1.4+ 时,还添加了对Kotlin 的不可变类的支持(通过带默认值的可选参数),以及对完全支持null 的API 的支持。
作为传统XML 和JavaConfig 的替代方案,现在可以使用lambda 表达式注册Spring bean,使bean 可以实际注册为提供者。下面代码中使用lambda 表达式注册了一个Book bean。将Bean 注册为提供者
GenericApplicationContext context = new GenericApplicationContext(); context.registerBean(Book.class, () -> new Book(context.getBean(Author.class)) );
Spring 5 中止了对一些过时API 的支持。遭此厄运的还有Hibernate 3 和4,为了支持Hibernate5,它们遭到了弃用。另外,对Portlet、Velocity、JasperReports、XMLBeans、JDO 和Guava 的支持也已中止。
包级别上的清理工作仍在继续:Spring 5 不再支持beans.factory.access、jdbc.support.nativejdbc、mock.staticmock(来自spring-aspects 模块)或web.view.tiles2M。Tiles 3 现在是Spring 的最低要求。
JUnit 和Spring 5:Spring 5 全面接纳了函数式范例,并支持JUnit 5 及其新的函数式测试风格。还提供了对JUnit 4 的向后兼容性,以确保不会破坏旧代码。
Spring 5 的测试套件通过多种方式得到了增强,但最明显的是它对JUnit 5 的支持。现在可以在您的单元测试中利用Java 8 中提供的函数式编程特性。
参考学习资料和相关文章列表,请参照如下链接:
https://blog.csdn.net/moonlight821/article/details/116463513