专栏首页JAVA乐园Spring Framework 5中的新功能和增强功能(文末送书)

Spring Framework 5中的新功能和增强功能(文末送书)

Spring 5 是一个重要的版本,距离 Spring 4 发布有四年多了。通过本文的介绍,我们一起来快速了解 Spring 5 发行版中的那些令人兴奋的特性。

基准升级

要构建和运行 Spring 5 应用程序,你至少需要 Java EE 7 和 JDK 8。以前的 JDK 和 Java EE 版本不再支持。 Java EE 7 包含:

  • Servlet 3.1
  • JMS 2.0
  • JPA 2.1
  • JAX-RS 2.0
  • Bean Validation 1.1

与 Java 基准类似,许多其他框架的基准也有变化。例如:

  • Hibernate 5
  • Jackson 2.6
  • EhCache 2.10
  • JUnit 5
  • Tiles 3

另外,各种服务器的最低支持版本也已经升级。包括:

  • Tomcat 8.5+
  • Jetty 9.4+
  • WildFly 10+
  • Netty 4.1+
  • Undertow 1.4+

同时,Spring 5 已经与最新的 Jave EE 8 API 集成,这意味着,用户可以使用 Spring 5 来创建最新的功能的应用。

兼容最新的 JDK 9

Spring 5 支持 JDK 9。在运行时,类路径以及模块路径与 JDK 9 完全一致。

Spring 5 使用了 Java 8 和 Java 9 版本中的许多新特性。例如:

  • Spring 接口中的默认方法。
  • 基于 Java 8 反射增强的内部代码改进。
  • 在框架代码中使用函数式编程,如 Lambda 表达式 和 Stream 流。

同时,Spring 5 的后续版本将会积极做好 JDK 10 的适配工作。

响应式编程模型

响应式编程是 Spring 5 最重要的特性之一。响应式编程提供了另一种编程风格,专注于构建对事件做出响应的应用程序。Spring 5 包含响应流和 Reactor(由 Spring 团队提供的 Reactive Stream 的 Java 实现)。

在 Spring 5 中,Web 开发将会划分为两个分支,即传统的基于 Servlet 的 Web 编程(spring-webmvc 模块),以及支持响应式编程模型 Spring WebFlux (spring-web-reactive 模块)。

构建在 Reactive Streams API 上 的 Web 应用程序,可以在非阻塞服务器(例如Netty、Undertow 和 Servlet 3.1+ 容器)上运行。

函数式编程

除了响应式功能之外,Spring 5 还提供了一个函数式 Web 框架。它提供了使用函数式编程风格来定义端点的特性。该框架引入了两个基本组件:HandlerFunction 和 RouterFunction。

HandlerFunction 表示处理接收到的请求并生成响应的函数。 RouterFunction 替代了 @RequestMapping 注解。它用于将接收到的请求路由到处理函数。例如:

import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.web.reactive.function.server.RequestPredicates.*;

PersonRepository repository = ...
PersonHandler handler = new PersonHandler(repository);

RouterFunction<ServerResponse> personRoute =
   route(GET("/person/{id}").and(accept(APPLICATION_JSON)), handler::getPerson)
       .andRoute(GET("/person").and(accept(APPLICATION_JSON)), handler::listPeople)
       .andRoute(POST("/person").and(contentType(APPLICATION_JSON)), handler::createPerson);

多语言的支持

Spring 5 支持 Apache Groovy 、Kotlin 以及其他众多的动态语言。这些动态语言包括:

  • JRuby 1.5+
  • Groovy 1.8+
  • BeanShell 2.0

Spring 5 支持 Kotlin 1.1+ 。Kotlin 是一种静态类型的 JVM 语言,它让代码具有表现力、简洁性和可读性。同时,Kotlin 与用 Java 编写的现有库拥有良好的互操作性。

Spring 5 框架为 Kotlin 提供了一流的支持,允许开发人员编写 Kotlin 应用程序,其开发体验感觉 Spring 框架就是 Kotlin 的原生框架一样。

以下就是一个 Kotlin 编写的路由到特定端点的例子:

@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)
       }
   }
}

支持 HTTP/2

Spring 5 将提供专用的 HTTP/2 特性支持,以及对 JDK 9 中的新 HTTP 客户端的支持。尽管 HTTP/2 的服务器推送功能已经可以通过 Jetty Servlet 引擎的ServerPushFilter 类来实现,但是如果 Spring 5 能够提供开箱即用的 HTTP/2 性能增强功能,势必会提升用户的开发体验。

清理了旧代码

随着 Java、JavaEE 和其他一些框架基准版本的增加,Spring 5 取消了对以下几个框架的支持,如:

  • Portlet
  • Velocity
  • JasperReports
  • XMLBeans
  • JDO
  • Guava

这些被取消的框架,都可以用最新的 Java EE 标准来实现替换。

Spring 5 不再支持一些过时的 API。被剔除的是 Hibernate 3和4版本,它们已经被Hibernate 5所替换。

Spring 5 对包级别也进行了清理。Spring 5 不再支持beans.factory.access、jdbc.support.nativejdbc、mock.staticmock 以及 web.view.tiles2M 等包。

更强的测试套件

Spring Test 拥有了更强的测试套件,包括支持 Spring WebFlux 服务器端点集成测试的 WebTestClient。 WebTestClient 使用模拟请求和响应来避免运行服务器,并能够直接绑定到 WebFlux 服务器基础架构中。

WebTestClient 可以被绑定到一个真实的服务器或者与控制器一起工作。

以下例子演示了 WebTestClient 绑定到 localhost 地址:

WebTestClient testClient = WebTestClient
 .bindToServer()
 .baseUrl("http://localhost:8080")
 .build();

另外一个例子,则演示了 WebTestClient 绑定到 RouterFunction:

RouterFunction bookRouter = RouterFunctions.route(
 RequestPredicates.GET("/books"),
 request -> ServerResponse.ok().build()
);

WebTestClient
 .bindToRouterFunction(bookRouter)
 .build().get().uri("/books")
 .exchange()
 .expectStatus().isOk()
 .expectBody().isEmpty();

本文分享自微信公众号 - JAVA乐园(happyhuangjinjin88)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 精讲Spring Boot—入门+进阶+实例

    在了解Spring Boot之前应该先了解下Spring,因为Spring Boot的核心是基于Spring构建的。Spring是由Rod Johnson在20...

    java乐园
  • 8、使用Java High Level REST Client操作elasticsearch

    Java High Level REST Client从6.0.0开始加入的,目的是以java面向对象的方式来进行请求、响应处理。每个API支持同步/异步两种方...

    java乐园
  • 消息中间件哪些事

    2.在客户端与服务器进行通讯时,客户端调用服务端接口后,必须等待服务端完成处理后返回结果给客户端才能继续执行,这种情况属于同步调用方式。

    java乐园
  • Springboot2.0教程(11)

    先来聊一聊Spring作为Java开发人员,大家都Spring可不陌生,简而言之,Spring框架为开发Java应用程序提供了全面的基础架构支持。...

    java进阶架构师
  • 为什么越来越多的开发者选择使用Spring Boot?

    使用Java做Web应用开发已经有近20年的历史了,从最初的Servlet1.0一步步演化到现在如此多的框架、库以及整个生态系统。经过这么长时间的发展,Java...

    Java技术江湖
  • 了解 spring 的整体架构

    POJO其实是比javabean更纯净的简单类或接口。 POJO严格地遵守简单对象的概念,而一些JavaBean中往往会封装一些简单逻辑。 POJO主要用于...

    lvgo
  • 《Spring实战》读书笔记-第1章 Spring之旅

    Spring是一个开源框架,最早由Rod Johnson创建,并在《Expert Oneon-One:J2EE Design and Development》这...

    Java架构师必看
  • Spring Boot 要怎么学?要学哪些东西?要不要先学 SSM?松哥说说看法

    公众号后台回复 SpringBoot,免费获取 274 页SpringBoot修炼手册。

    江南一点雨
  • 金三银四Java面试必备132道Spring系列问题解析,吃透让你涨薪10K

    春节过后就是招聘旺季,因为疫情的影响,今年的金三银四有些特别,危机面前,持续的提高自己才是王道,提前准备下面试,有备无患。在这免费分享Spring,Spring...

    用户5546570
  • 有网友说:2020年还不懂Spring就放弃Java吧?

    Spring这个词对于开发者想必不会陌生,可能你每天都在使用Spring,享受着Spring生态提供的服务,理所当然的用着SpringIOC和SpringAOP...

    程序员追风

扫码关注云+社区

领取腾讯云代金券