springboot 2.0 更新内容
测试
对 Spring Boot 2.0 中测试进行了一些补充和调整:
@WebFluxTest 已添加新注释以支持 WebFlux 应用程序的“slice”测试。
Converter 和 GenericConverter beans 现在自动扫描 @WebMvcTest 和 @WebFluxTest。
@AutoConfigureWebTestClient 已经添加到 WebTestClient 供测试使用,这个注释会自动应用于 @WebFluxTest 测试。
增加了一个新的 ApplicationContextRunner 测试实用程序,可以很容易地测试你的自动配置,我们已将大部分内部测试套件移至此新模型。
其他
还有一些小的调整和改进:
@ConditionalOnBean 现在在确定是否满足条件时使用逻辑 AND 而不是逻辑 OR。
无条件类现在包含在自动配置中。
该 spring CLI 应用程序现在包括 encodepassword 可用于创建 Spring Security 的兼容散列密码命令。
计划任务(即 @EnableScheduling)可以使用 scheduledtasks 执行器端点进行审查。
该 loggers 驱动器终端现在允许你重新设置一个日志的默认级别。
Spring Session 用户现在可以通过 sessions 执行器端点查找和删除会话。
使用 spring-boot-starter-parent 现在基于 Maven 的应用程序 -parameters 默认使用标志。
新技术的引入
支持 HTTP/2
HTTP/2 是第二代的 HTTP 协议,Spring Boot 的 Web 容器选择中 Tomcat,Undertow 和 Jetty 均已支持 HTTP/2。
相比 HTTP/1.x,HTTP/2 在底层传输做了很大的改动和优化:
HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能。
HTTP/2 对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量;而 HTTP/1.x 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源;头压缩能够很好的解决该问题。
多路复用,直白的说就是所有的请求都是通过一个 TCP 连接并发完成。HTTP/1.x 虽然通过 pipeline 也能并发请求,但是多个请求之间的响应会被阻塞的,所以 pipeline 至今也没有被普及应用,而 HTTP/2 做到了真正的并发请求。同时,流还支持优先级和流量控制。
Server Push:服务端能够更快的把资源推送给客户端。例如,服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送这些请求,当客户端需要的时候,它已经在客户端了。
嵌入式 Netty 服务器
由于 WebFlux 不依赖于 Servlet API,我们现在可以首次为 Netty 作为嵌入式服务器提供支持,该 spring-boot-starter-webflux 启动 POM 将拉取 Netty 4.1 和 Ractor Netty。
Kotlin 的支持
Spring Boot 2.0 现在包含对 Kotlin 1.2.x 的支持,并提供了 runApplication,一个使用 Kotlin 运行 Spring Boot 应用程序的方法。我们还公开和利用了 Kotlin 对其他 Spring 项目(如 Spring Framework,Spring Data 和 Reactor)已添加到其最近版本中的支持。
JOOQ 的支持
JOOQ 是基于 Java 访问关系型数据库的工具包。JOOQ 既吸取了传统 ORM 操作数据的简单性和安全性,又保留了原生 SQL 的灵活性,它更像是介于 ORMS 和 JDBC 的中间层。对于喜欢写 SQL 的码农来说,JOOQ 可以完全满足你控制欲,可以是用 Java 代码写出 SQL 的感觉来。
支持 Quartz
Spring Boot 1.0 并没有提供对 Quartz 的支持,之前出现了各种集成方案,Spring Boot 2.0 给出了最简单的集成方式。
响应式编程
WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。Spring WebFlux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。
非阻塞的关键预期好处是能够以小的固定数量的线程和较少的内存进行扩展。在服务器端 WebFlux 支持两种不同的编程模型:
基于注解的 @Controller 和其他注解也支持 Spring MVC;
Functional 、Java 8 Lambda 风格的路由和处理。
默认情况下,Spring Boot 2.0 使用 Netty WebFlux,因为 Netty 在异步非阻塞空间中被广泛使用,异步非阻塞连接可以节省更多的资源,提供更高的响应度。通过比较 Servlet 3.1 非阻塞 I/O 没有太多的使用,因为使用它的成本比较高,Spring WebFlux 打开了一条实用的通路。
使用 Spring WebFlux/WebFlux.fn 提供响应式 Web 编程支持,WebFlux 是一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好,此功能来源于 Spring 5.0。
Spring Boot 2.0 也提供了对响应式编程的自动化配置,如 Reactive Spring Data、Reactive Spring Security 等。