温故 Spring5 特性

news2024/11/18 3:23:51

图片

一、前言

随着技术的不断发展,Spring框架也在不断地更新迭代。我们将温故Spring 5的特性,并探讨如何在实际项目中应用这些特性来提升开发效率和系统性能。

Spring 5是Spring框架的一个重要版本,它带来了许多新特性,包括对Java 8的支持、WebFlux的引入、响应式流等等。本文将详细介绍Spring 5的新特性,并通过代码说明如何使用这些新特性。

二、特性

2.1 升级到 Java SE 8 和 Java EE 7

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

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

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

2.2 反应式编程模型

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

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

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

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

2.3 使用注解进行编程

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 框架来解决同一个问题。

2.4 函数式编程

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

栗子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
}

通过路由函数来匹配 HTTP 请求谓词与媒体类型,将客户端请求路由到处理函数。栗子 3 展示了图书资源端点 URI 将调用委托给合适的处理函数:

栗子3. Router 函数


BookHandler handler = new BookHandler();

RouterFunction<ServerResponse> personRoute =
 route(
 GET("/books/{id}")
 .and(accept(APPLICATION_JSON)), handler::getBook)
 .andRoute(
 GET("/books")
 .and(accept(APPLICATION_JSON)), handler::listBooks);

这些示例背后的数据存储库也支持完整的反应式体验,该体验是通过 Spring Data 对反应式 Couchbase、ReactiveMongoDB 和 Cassandra 的支持来实现的。

2.5 使用 REST 端点执行反应式编程

新的编程模型脱离了传统的 Spring WebMVC 模型,引入了一些很不错的新特性。

举例来说,WebFlux 模块为 RestTemplate 提供了一种完全非阻塞、反应式的替代方案,名为WebClient。栗子4 创建了一个 WebClient,并调用 books 端点来请求一本给定 id 为 1234 的图书。

栗子4. 通过 WebClient 调用 REST 端点


Mono<Book> book = WebClient.create("http://localhost:8080")

.get()
 .url("/books/{id}", 1234)
 .accept(APPLICATION_JSON)
 .exchange(request)
 .then(response -> response.bodyToMono(Book.class));

2.6 HTTP/2 支持

HTTP/2 幕后原理:要了解 HTTP/2 如何提高传输性能,减少延迟,并帮助提高应用程序吞吐量,从而提供经过改进的丰富Web 体验,请查阅我的有关这项期待已久的升级的文章。

Spring Framework 5.0 将提供专门的 HTTP/2 特性支持,还支持人们期望出现在JDK 9 中的新 HTTP 客户端。尽管 HTTP/2 的服务器推送功能已通过 Jetty servlet引擎的 ServerPushFilter 类向 Spring 开发人员公开了很长一段时间,但如果发现Spring 5 中开箱即用地提供了 HTTP/2性能增强,Web 优化者们一定会为此欢呼雀跃。

Java EE Servlet 规范预计将于 2017 年第 4 季度发布,Servlet 4.0支持将在 Spring 5.1 中提供。到那时,HTTP/2 特性将由 Tomcat 9.0、Jetty 9.3 和 Undertow 1.4 原生提供。

2.7 Kotlin 和 Spring WebFlux

Kotlin 是一种来自 JetBrains 的面向对象的语言,它支持函数式编程。它的主要优势之一是与Java 有非常高的互操作性。通过引入对 Kotlin 的专门支持,Spring 在 V5 中全面吸纳了这一优势。它的函数式编程风格与Spring WebFlux 模块完美匹配,它的新路由 DSL 利用了函数式 Web 框架以及干净且符合语言习惯的代码。可以像栗子5 中这样简单地表达端点路由:

栗子5. 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 的支持。

2.8 使用 Lambda 表达式注册 bean

作为传统 XML 和 JavaConfig 的替代方案,现在可以使用 lambda 表达式注册 Springbean,使 bean 可以实际注册为提供者。栗子 6 使用 lambda 表达式注册了一个 Bookbean。

栗子6. 将 Bean 注册为提供者


GenericApplicationContext context = new GenericApplicationContext();

context.registerBean(Book.class, () -> new
 Book(context.getBean(Author.class))
 );

2.9 Spring WebMVC 支持最新的 API

全新的 WebFlux 模块提供了许多新的、令人兴奋的功能,但 Spring 5 也迎合了愿意继续使用Spring MVC 的开发人员的需求。Spring 5 中更新了模型-视图-控制器框架,以兼容 WebFlux和最新版的Jackson 2.9 和 Protobuf 3.0,甚至包括对新的 Java EE 8JSON-Binding API 的支持。

除了 HTTP/2 特性的基础服务器实现之外,Spring WebMVC 还通过 MVC 控制器方法的一个参数来支持Servlet 4.0 的 PushBuilder。最后,WebMVC 全面支持 Reactor 3.1的 Flux 和 Mono 对象,以及 RxJava1.3 和 2.1,它们被视为来自 MVC 控制器方法的返回值。这项支持的最终目的是支持Spring Data 中的新的反应式 WebClient 和反应式存储库。

2.10 使用 JUnit 5 执行条件和并发测试

JUnit 和 Spring 5:Spring 5 全面接纳了函数式范例,并支持 JUnit 5 及其新的函数式测试风格。还提供了对JUnit 4 的向后兼容性,以确保不会破坏旧代码。

Spring 5 的测试套件通过多种方式得到了增强,但最明显的是它对JUnit 5 的支持。现在可以在您的单元测试中利用Java 8 中提供的函数式编程特性。栗子 7 演示了这一支持:

栗子7. JUnit 5 全面接纳了 Java 8 流和 lambda 表达式


@Test

void givenStreamOfInts_SumShouldBeMoreThanFive() {
 assertTrue(Stream.of(20, 40, 50)
 .stream()
 .mapToInt(i -> i)
 .sum() > 110, () -> "Total should be more than 100");
}

迁移到 JUnit 5:如果您对升级到 JUnit 5 持观望态度,Steve Perry 的分两部分的深入剖析教程将说服您冒险尝试。

Spring 5 继承了 JUnit 5 在 Spring TestContext Framework内实现多个扩展 API 的灵活性。举例而言,开发人员可以使用 JUnit 5 的条件测试执行注解 @EnabledIf和 @DisabledIf 来自动计算一个 SpEL (Spring Expression Language)表达式,并适当地启用或禁用测试。借助这些注解,Spring 5 支持以前很难实现的复杂的条件测试方案。SpringTextContext Framework 现在能够并发执行测试。

2.11 使用 Spring WebFlux 执行集成测试

Spring Test 现在包含一个 WebTestClient,后者支持对 Spring WebFlux服务器端点执行集成测试。WebTestClient 使用模拟请求和响应来避免耗尽服务器资源,并能直接绑定到WebFlux 服务器基础架构。

WebTestClient 可绑定到真实的服务器,或者使用控制器或函数。在栗子 8 中,WebTestClient被绑定到 localhost:

栗子8. 绑定到 localhost 的 WebTestClient


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

栗子9. 将 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();

2.12 包清理和弃用

Spring 5 中止了对一些过时 API 的支持。遭此厄运的还有 Hibernate 3 和 4,为了支持Hibernate 5,它们遭到了弃用。另外,对 Portlet、Velocity、JasperReports、XMLBeans、JDO 和 Guava 的支持也已中止。

包级别上的清理工作仍在继续:Spring 5 不再支持beans.factory.access、jdbc.support.nativejdbc、mock.staticmock(来自spring-aspects 模块)或 web.view.tiles2M。Tiles 3 现在是 Spring的最低要求。

2.13 对 Spring 核心和容器的一般更新

Spring Framework 5 改进了扫描和识别组件的方法,使大型项目的性能得到提升。目前,扫描是在编译时执行的,而且向META-INF/spring.components 文件中的索引文件添加了组件坐标。该索引是通过一个为项目定义的特定于平台的应用程序构建任务来生成的。

标有来自 javax 包的注解的组件会添加到索引中,任何带 @Index 注解的类或接口都会添加到索引中。Spring的传统类路径扫描方式没有删除,而是保留为一种后备选择。有许多针对大型代码库的明显性能优势,而托管许多Spring 项目的服务器也会缩短启动时间。

Spring 5 还添加了对 @Nullable 的支持,后者可用于指示可选的注入点。使用者现在必须准备接受null 值。此外,还可以使用此注解来标记可以为 null 的参数、字段和返回值。@Nullable 主要用于 IntelliJ IDEA 等 IDE,但也可用于 Eclipse 和 FindBugs,它使得在编译时处理null 值变得更方便,而无需在运行时发送 NullPointerExceptions。

Spring Logging 还提升了性能,自带开箱即用的 Commons Logging 桥接器。现在已通过资源抽象支持防御性编程,为getFile 访问提供了 isFile 指示器。

三、总结

本文温故了Spring 5的几个新特性,包括支持Java 8的Optional类、支持Java 9的模块化系统和支持WebFlux响应式编程模型。这些新特性可以帮助我们更加方便地编写代码和管理依赖关系,提高开发效率和系统性能。在未来的开发中,我们应该积极地学习和掌握这些新特性,以便更好地应对日益复杂的开发需求。同时,我们也应该注意到Spring框架在不断地更新和完善,我们应该保持关注并及时了解最新的动态,以便更好地利用这一优秀的开发工具。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1066531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Eclipse iceoryx(千字自传)

1 在固定时间内实现无任何限制的数据传输 在汽车automotive、机器人robotics和游戏gaming等领域,必须在系统的不同部分之间传输大量数据。使用Linux等操作系统时,必须使用进程间通信(IPC)机制传输数据。Eclipse iceoryx是一种中间件,它使用零拷贝Zero-Copy、共享内存Share…

MySQL笔记(进阶篇)

包含内容: 存储引擎 索引 SQL优化 视图/存储过程/触发器 锁 InnoDB引擎 MySQL管理 存储引擎 MySQL体系结构 连接层:最上层是一些客户端和连接服务,主要完成一些类似于连接处理,授权认证,及相关的安全方案.服务器也会为安全接入的每个客户验证它所…

SAP配置BOM数据结构详解-整车(SAP配置BOM攻略十)

一、MBOM数据 1、一个产品由多个物料构成&#xff0c;每个物料构成MBOM的一行。 2、工程变更号在BOM数据中是必须的。变更号的实质是通过变更号指向某个生效日期。通过变更号关联的日期区间&#xff0c;可用决定这个物料数据是否启用。 二、特征数据 1、一个车可用分类为多个…

P1-P5_动手学深度学习-pytorch(李沐版,粗浅的笔记)

目录 预告  1.学习深度学习的关键是动手  2.什么是《动手学深度学习》  3.曾经推出的版本&#xff08;含github链接&#xff09; 一、课程安排  1.目标  2.内容  3.上课形式  4.你将学到什么  5.资源 二、深度学习的介绍  1.AI地图  2.深度学习在一些应用上…

【数据结构与算法】之“堆”介绍

目录 堆的基本存储 一、概念及其介绍 二、适用说明 三、结构图示 堆的 shift up 堆的 shift down 基础堆排序 一、概念及其介绍 二、适用说明 三、过程图示 优化堆排序 索引堆及其优化 一、概念及其介绍 二、适用说明 三、结构图示 堆的基本存储 一、概念及其介…

SiegedSec 黑客组织袭击北约网络系统

Security Affairs 网站披露&#xff0c;一个名为 SiegedSec 的网络攻击组织近期成功入侵了北约网络系统&#xff0c;并在网上散布盗取的大量非机密文件。 目前&#xff0c;北约正在就此事展开积极调查&#xff0c;其所属官员发表声明表示&#xff0c;北约内部已经组织了大量的网…

智能导览与实时监测:数字孪生助力景区管理

在当今旅游业快速发展的背景下&#xff0c;景区“人流管理”成为了一个越来越重要的问题。数字孪生技术由于其自身优势&#xff0c;可以为景区管理者提供更智能、更高效的管理方案。本文结合山海鲸可视化几个数字孪生案例带大家一起了解数字孪生在景区人流管理方面的应用&#…

计算机竞赛 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

架构师选择题--计算机网络

架构师选择题--计算机网络 真题 真题 d http:80 https:httpssl &#xff1a;443 b b pop3是邮件接收协议&#xff1a;110 SMTP是邮件发送协议&#xff1a;25 http:80 A 网络隔离&#xff1a;防火墙&#xff08;逻辑&#xff09;&#xff0c;网闸&#xff08;物理&#xff09; …

OpenCV4(C++) —— 图像数据类型转换和颜色模型转换

文章目录 一、图像数据类型转换二、颜色模型转换三、通道的分离和融合 一、图像数据类型转换 OpenCV中使用imread读取一张彩色图像时&#xff0c;默认采用的是BGR通道和整数类型(0-255&#xff0c;CV_8U)。 在某些情况下&#xff0c;会将整数类型(0-255)转换为浮点类型(0-1)&a…

助力电力行业数字化转型:智慧风电项目介绍

智慧电力作为电力领域的突破性进展&#xff0c;旨在实现能源领域的数字化转型。智慧电力借助数字孪生、IOT、云计算等技术&#xff0c;将传统的电力系统升级为高智能、高效能的系统&#xff0c;助力传统能源企业实现数字化转型。下面让我们来看一看山海鲸可视化提供的智慧电力相…

c#利用Chart 画图

c#利用Chart 画图 添加画图组件 编写代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; …

【网络安全-sql注入(5)】sqlmap以及几款自动化sql注入工具的详细使用过程(提供工具)

一&#xff0c;sqlmap 工具的详细使用 kali系统自带这个工具&#xff0c;无需安装直接sqlmap 后面接参数使用 Windows上参照以下方法安装即可 1-1 工具下载 1-1-1 sqlmap下载 sqlmap 工具下载地址&#xff1a; GitHub - sqlmapproject/sqlmap: Automatic SQL injection a…

6-6 两个有序链表序列的合并 分数 10

List Merge(List L1, List L2) {if (L1 NULL)return L2;if (L2 NULL)return L1;// 定义指针p和q分别指向链表L1和L2的头结点List p L1->Next;List q L2->Next;// 定义新链表的头结点和指针rList head (List)malloc(sizeof(struct Node));head->Next NULL;List r…

WinScope跟踪window/layer pb文件

WinScope web用来跟踪分析WindowManager或SurfaceFlinger在window转换期间和转换后的状态&#xff0c;跟踪记录会被写入 /data/misc/wmtrace/wm_trace.pb 和 /data/misc/wmtrace/layers_trace.pb&#xff0c;同时还会包含在错误报告中。 一、下载winscope.html curl https://a…

Cocos Creator3.8 项目实战(四)巧用九宫格图像拉伸

一、为什么要使用九宫格图像拉伸 相信做过前端的同学都知道&#xff0c;ui &#xff08;图片&#xff09;资源对包体大小和内存都有非常直接的影响。 通常ui 资源都是图片&#xff0c;也是最占资源量的资源类型&#xff0c;游戏中的ui 资源还是人机交互的最重要的部分&#xff…

阿里影业+大麦,开启大文娱新纪元?

被“精心呵护”长达十年后&#xff0c;阿里大文娱在今年终于踏上了关键节点。 3月份&#xff0c;阿里“16N”组织大变革后&#xff0c;大文娱集团独自上路。8月&#xff0c;“分家”后的第一份财报显示&#xff0c;阿里大文娱集团成功大幅扭亏&#xff0c;实现了首次季度经调整…

ToBeWritten之狩猎恶意攻击者

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

如何下载修复xinput1_3.dll并避免常见错误 ,详解多种实用解决方法

在运行某些应用程序或游戏时&#xff0c;您可能会遇到xinput1_3.dll丢失或损坏的错误提示。这是由于操作系统缺少xinput1_3.dll文件所引起的。针对以上问题&#xff0c;我们提供了几种解决方法来修复这个问题。本文将详细介绍如何下载修复xinput1_3.dll&#xff0c;并提供一些建…

【LeetCode75】第六十六题 编辑距离

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们三种操作方式&#xff0c;插入一个字符&#xff0c;删除一个字符&#xff0c;替换一个字符。 问我们最少操作几次可以把字符串…