Spring WebFlux简单使用

news2024/11/24 23:05:46

官网:https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html

1.WebFlux介绍

Spring WebFlux 是 Spring Framework 5.0中引入的新的响应式web框架。与Spring MVC不同,它不需要Servlet API,是完全异步且非阻塞的,并且通过Reactor项目实现了Reactive Streams规范。

  • Mono:实现发布者,即要么成功发布并返回 0 或 1 个元素,要么错误。
  • Flux:实现发布者,即要么成功发布 0 到 N 个元素,要么错误。

2.bean方式路由

2.0.引入pom

<dependency>
    <groupId>io.projectreactor</groupId>
    <artifactId>reactor-test</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

2.1.编写处理器类 Handler

@Slf4j
@Component
public class UserHandler {

    private User user;

    @PostConstruct
    public void init() {
        User user = new User()
                .setPhone("12345678901")
                .setUserId(1L)
                .setUserName("WebFlux");
        this.user = user;
    }

    public Mono<ServerResponse> helloUser(ServerRequest request) {
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(user));
    }
}

2.2.编写路由器类 Router

@Configuration
public class UserRouter {

    @Bean
    public RouterFunction<ServerResponse> routeUser(UserHandler userHandler) {
        return RouterFunctions.route(RequestPredicates.GET("/bean/webflux")
                .and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), userHandler::helloUser);
    }
}

2.3.访问测试

image-20220115235703169

3.使用自动配置加注解驱动的模式

3.1.编写处理器类 Handler

@Slf4j
@Component
public class UserHandler {

    private User user;

    @PostConstruct
    public void init() {
        User user = new User()
                .setPhone("12345678901")
                .setUserId(1L)
                .setUserName("WebFlux");
        this.user = user;
    }

    public Flux<User> listUser() {
        List<User> userList = new ArrayList<>();
        userList.add(user);
        return Flux.fromIterable(userList);
    }

    public Mono<User> getById(Long id) {
        log.debug("查询用户:{}", id);
        return Mono.justOrEmpty(user);
    }

    public Mono<Boolean> saveUser(User user) {
        log.debug("新增用户:{}", user);
        return Mono.create(userMonoSink -> userMonoSink.success());
    }

    public Mono<Boolean> updateUser(User user) {
        log.debug("修改用户:{}", user);
        return Mono.create(userMonoSink -> userMonoSink.success());
    }

    public Mono<Boolean> removeUser(Long userId) {
        log.debug("删除用户:{}", userId);
        return Mono.create(userMonoSink -> userMonoSink.success());
    }
}

3.2.编写controller

@AllArgsConstructor
@RestController
@RequestMapping("/webflux")
public class WebFluxController {

    private final UserHandler userHandler;

    @GetMapping("/list")
    public Flux<User> listUser() {
        return userHandler.listUser();
    }

    @GetMapping("/{id}")
    public Mono<User> getById(@PathVariable("id") Long id) {
        return userHandler.getById(id);
    }

    @PostMapping
    public Mono<Boolean> saveUser(@RequestBody User user) {
        return userHandler.saveUser(user);
    }

    @PutMapping
    public Mono<Boolean> updateUser(@RequestBody User user) {
        return userHandler.updateUser(user);
    }

    @DeleteMapping("/{id}")
    public Mono<Boolean> deleteUser(@PathVariable("id") Long id) {
        return userHandler.removeUser(id);
    }
}

3.3.postman测试

image-20220116104807148

image-20220116104830580

image-20220116104857859

image-20220116104922257

image-20220116104952870

2022-01-16 10:48:19.987 DEBUG 3540 --- [ctor-http-nio-3] top.dongxibao.demo.handler.UserHandler   : 查询用户:1
2022-01-16 10:48:43.028 DEBUG 3540 --- [ctor-http-nio-3] top.dongxibao.demo.handler.UserHandler   : 新增用户:User(userId=null, userName=null, phone=null)
2022-01-16 10:49:04.686 DEBUG 3540 --- [ctor-http-nio-3] top.dongxibao.demo.handler.UserHandler   : 修改用户:User(userId=null, userName=null, phone=null)
2022-01-16 10:49:36.560 DEBUG 3540 --- [ctor-http-nio-3] top.dongxibao.demo.handler.UserHandler   : 删除用户:1

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

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

相关文章

蓝桥杯嵌入式LCD屏幕

文章目录前言一、拷贝官方例程二、cubeMX配置三、LCD代码及函数分析使用四、sprintf函数总结前言 本篇文章将带大家学习LCD屏幕的操作&#xff0c;LCD的配置是非常复杂的&#xff0c;在比赛上去实现这些驱动程序基本上是不可能的&#xff0c;当然了比赛官方也是知道这一点的&a…

SpringMVC基础篇:MVC基础知识

第一章&#xff1a;SpringMVC引言 一&#xff1a;什么是SpringMVC 概念&#xff1a;SpringMVC是在Spring框架基础上衍生而来的一个MVC框架&#xff0c;主要解决了原有的MVC框架过程中控制器&#xff08;Controller&#xff09;的问题。 SpringMVC是Java开发当中最主流的web技…

了解软件测试

软件测试课程 1.1课程内容&#xff1a; 软件基础课程 ------设计测试用例方法 自动化课程&#xff08;web自动化&#xff09;------ 抢票功能 性能测试课程 ----项目性能测试 1.2 什么是测试 1.21 生活中测试的案例 坐地铁&#xff0c;做核酸&#xff0c;扫核酸码 比如当我…

[附源码]计算机毕业设计学生社团信息管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

零基础学习软件测试,掌握四点就够了

近年来越来越多的人转行到软件测试这一领域&#xff0c;对于很多外行的人来说&#xff0c;肯定对这一行业有很多不了解&#xff0c;对于这一职业的职责以及要求都会不清楚&#xff0c;那么我们今天就来梳理一下关于软件测试行业的信息。 一、软件测试的主要职责你知道吗&#x…

裸辞闭关60天,啃下这些软件测试笔记,有幸通过阿里测开岗P6面试

时代在发展&#xff0c;互联网之下&#xff0c;稍有一些落后可能就会被淘汰掉&#xff0c;因此我们需要不断去审视自己&#xff0c;通过学习来让自己得到相应的提升。 近段时间&#xff0c;我也了解到很多小伙伴不清楚作为测试工程师应该掌握什么样的核心知识&#xff1f;实际…

暴力算法 --- 莫队

文章目录莫队基础莫队带修改莫队树上莫队回滚莫队莫队 什么是莫队&#xff1f; 答&#xff1a;优雅的暴力&#xff01;&#xff01;&#xff01; 基础莫队 重复的数 题目描述&#xff1a;给出一个长度为NNN的序列&#xff0c;有若干查询&#xff0c;每次查询区间[li,ri][l_i,…

网页信息抓取-网页信息采集器

抓取整个网页&#xff0c;我们怎么抓取整个网页自己想要的文章内容&#xff0c;很多人一想到内容抓取。就想到要学习一门编程语言&#xff0c;最让大家熟知的就是python爬虫。如果完全靠自己自学&#xff0c;又是从零基础开始学习Python的情况下&#xff0c;我认为至少需要半年…

Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏

云收藏项目已经开源2年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时很新的技术,现在看来其实很多新技术是没有必要使用的,但做为学习案例来讲确实是一个绝佳的 Spring Boot 实践。 从开源到现在,写了一些教程给大家介绍如何部署云收藏,如何在IDE中运…

[附源码]计算机毕业设计ssm校园二手交易平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

解决JSP中Bean在页面显示不正确问题(scope关键字)

问题出现 有一天我在编写JSP的程序时&#xff0c;在Java后端写了跳转并且传输数据语句&#xff0c;但前端界面渲染出来的数据却是我在DAO中初始化的数据。 第一句语句将book对象注入request的Session中&#xff0c;第二句实现跳转到JSP页面&#xff0c;第三句将此时的request和…

Logistic回归——银行违约情况分析

文章目录一、Logistic回归原理1、Sigmoid函数作用2、用梯度下降法求解参数二、利用Logistic回归分类1、数据预处理2、利用梯度上升计算回归系数3、训练和验证总结一、Logistic回归原理 1、Sigmoid函数作用 Logistic回归的原理是用逻辑函数把线性回归的结果(-∞,∞)映射到(0,1…

【408篇】C语言笔记-第十章(线性表)

文章目录第一节&#xff1a;线性表的顺序表示线性表1. 定义2. 特点线性表的顺序表示1. 顺序表2. 优缺点比较3. 插入操作4. 删除操作5. 动态分配代码示例第二节&#xff1a;线性表的链式表示单链表优缺点对比插入操作删除操作代码示例第一节&#xff1a;线性表的顺序表示 线性表…

python中的序列(列表、元组、字符串)的切片操作

目录 一.序列 二. 序列常用操作——切片 注意 演示 一.序列 序列是指:内容连续、有序&#xff0c;可使用下标索引的一类数据容器 列表、元组、字符串&#xff0c;均可以可以视为序列。 二. 序列常用操作——切片 序列支持切片&#xff0c;即:列表、元组、字符串&#xf…

看卡塔尔世界杯,diff一下足球比赛与软件开发

diff一下足球比赛与软件开发吐槽世界杯E组&#xff01;类比软件开发与足球比赛教练与架构师的作用新技术——半自动越位技术世界杯冠军吐槽世界杯E组&#xff01; 最近博主看了多场世界杯比赛&#xff0c;看的我心力交瘁&#xff0c;欲哭无泪。 从日本与哥斯达黎加那场比赛开始…

算法刷题打卡第34天:有效的井字游戏

有效的井字游戏 难度&#xff1a;中等 给你一个字符串数组 boardboardboard 表示井字游戏的棋盘。当且仅当在井字游戏过程中&#xff0c;棋盘有可能达到 boardboardboard 所显示的状态时&#xff0c;才返回 truetruetrue 。 井字游戏的棋盘是一个 3 x 3 数组&#xff0c;由字…

MYSQL 中连接的使用

文章目录0 写在前面1 语法说明2 SQL准备3 举例说明3.1 内连接3.2 左连接3.3 右连接4 写在最后0 写在前面 实际业务中&#xff0c;查询数据库大多都是多表链接查询&#xff0c;所以MYSQL的连接的使用非常重要。 连接有三种: INNER JOIN&#xff08;内连接,或等值连接&#xff0…

[附源码]计算机毕业设计疫情背景下社区互助服务系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Git基本使用

目录 一、Git基础 1.Git与Github 2.注册Github账号并安装Git 二、Git的使用 1.本地仓库 进行全局配置&#xff1a; 创建仓库&#xff1a; Git常用操作指令&#xff1a; 版本回退&#xff1a; 2.远程仓库 两种常规使用方式&#xff1a; 分支管理&#xff1a; 冲突的产生…

python http模块快速搭建“简单”服务器笔记

极简运行 python -m http.sever或 # test.py import http.server import socketserverPORT 8000Handler http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", PORT), Handler) as httpd:print("serving at port", PORT)httpd.serve…