SpringBoot系列11-webflux

猿份哥 1年前 ⋅ 772 阅读 ⋅ 0 个赞
文章目录
  1. 1.基础依赖
  2. 2.数据准备
  3. 3.按照传统方法的思路定义Controller直接调用
  4. 4.使用路由的方式调用

springboot webflux简单示例

基础依赖

pom.xml文件引入依赖文件spring-boot-starter-webflux,是整个项目webflux的支持

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

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

数据准备

定义学生实体类:包括姓名和年龄属性


/**
 * @author 猿份哥
 * @description
 * @createTime 2019/1/29 22:35
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Student {

    private String name;
    private int age;
}

StuService.java定义了一个查询单个学生获取的方法selectSimple,和学生列表获取的方法selectList

/**
 * @author 猿份哥
 * @description
 * @createTime 2019/1/29 22:36
 */
@Service
public class StuService {

    public Student selectSimple(){
        return Student.builder()
                .name("猿份哥")
                .age(20)
                .build();
    }

    public List<Student> selectList(){
        List<Student> datas=new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Student item=Student.builder()
                    .name("猿份哥"+i)
                    .age(20+i)
                    .build();
            datas.add(item);
        }
        return datas;
    }
}

按照传统方法的思路定义Controller直接调用

FluxController.java


/**
 * @author 猿份哥
 * @description
 * @createTime 2019/1/29 22:34
 */
@RestController
@RequestMapping("/student")
public class FluxController {

    @Autowired
    private StuService stuService;

    @RequestMapping("/item")
    public Mono<Student> item(){
        return Mono.just(stuService.selectSimple());
    }

    @RequestMapping("/list")
    public Flux<Student> list(){
        return Flux.fromIterable(stuService.selectList());
    }
}

说明:item方法是调用业务层单个数据,使用Mono返回;list是调用多个数据,使用Flux返回

浏览器输入:http://localhost:8080/student/item

返回结果:单个学生信息

{
    "name": "猿份哥",
    "age": 20
}

浏览器输入:http://localhost:8080/student/list 返回结果:学习列表

[
    {
        "name": "猿份哥0",
        "age": 20
    },
    {
        "name": "猿份哥1",
        "age": 21
    }
]

使用路由的方式调用

步骤:

1.定义handler

StudentHandler.java

/**
 * @author 猿份哥
 * @description
 * @createTime 2019/1/29 22:57
 */
@Component
public class StudentHandler {
    @Autowired
    private StuService stuService;

    public Mono<ServerResponse> getStuSimple(ServerRequest serverRequest){
        return ok().contentType(MediaType.APPLICATION_JSON)
        .body(Mono.just(stuService.selectSimple()),Student.class);
    }

    public Mono<ServerResponse> getList(ServerRequest serverRequest){
        return ok().contentType(MediaType.APPLICATION_JSON)
                .body(Flux.fromIterable(stuService.selectList()),Student.class);
    }
}

说明:

ok():是ServerResponse的静态方法需要导入import static org.springframework.web.reactive.function.server.ServerResponse.ok; 也可以直接ServerResponse.ok()方式调用

contentType:响应数据格式

Mono.just:返回单条数据信息

Flux.fromIterable:返回多条数据信息

2.定义router

RouteConfig.java

/**
 * @author 猿份哥
 * @description
 * @createTime 2019/1/29 22:54
 */
@Configuration
public class RouteConfig {
    @Autowired
    private StudentHandler studentHandler;

    @Bean
    public RouterFunction<ServerResponse> stuRouter(){
        return route(GET("/stu"),serverRequest -> studentHandler.getStuSimple(serverRequest));
    }

    @Bean
    public RouterFunction<ServerResponse> listRouter(){
        return route(GET("/students"),serverRequest -> studentHandler.getList(serverRequest));
    }
}

说明:

route:静态方法导入import static org.springframework.web.reactive.function.server.RouterFunctions.route;

GET:接收GET请求和访问路径如:”/stu”静态方法导入import static org.springframework.web.reactive.function.server.RequestPredicates.GET;

3.测试访问

浏览器输入:http://localhost:8080/stu

返回结果:单个学生信息

{
    "name": "猿份哥",
    "age": 20
}

浏览器输入:http://localhost:8080/students

返回结果:学习列表

[
    {
        "name": "猿份哥0",
        "age": 20
    },
    {
        "name": "猿份哥1",
        "age": 21
    }
]

源码下载链接

原文链接: http://www.lskyf.com/view/37

作者:猿份哥,版权所有,欢迎保留原文链接进行转载:)


全部评论: 0

    我有话说:

    Spring Boot系列1-helloword

      使用springboot简单轻松创建helloword SpringBoot系列1-helloword 关于springboot这是摘自官方的一段话 Spring Boot

    Spring Boot系列7-SpringBoot+mybatis+druid+TypeHandler

    介绍在SpringBoot中集成mybatis和druid以及自定义TypeHandler 创建数据库表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- --------------------...

    Spring Boot系列6-SpringBoot中使用servlet

    介绍在SpringBoot中如何使用servlet pom.xml <dependency> <groupId>org.springframework.boot<

    SpringBoot系列10-文件上传

    文章目录 1.先来最简单的 2.设置文件大小,请求大小 3.多文件上传 怎样使用最简单的方式上传文件,如何上传多个文件呢 先来最简单的 pom.xml文件引入依赖文件 <dependencies> <dependenc...

    SpringBoot系列15-mysql-multiple-data-sources1

    springboot 多数据源的一个简单示例 多数据源分包加载 新建数据库test1和表tbl_user CREATE TABLE `tbl_user` ( `id` int(11) NOT

    SpringBoot系列9-使用jasypt自定义stater运行时动态传入加密密码

    文章目录 1.新建springboot-encryption-configuration项目实现stater 2.pom文件引入jasypt 3.在resources/support/下配置

    Spring Boot系列2-全局统一异常处理

    原创: 天空和唯美 天空唯美  点击查看原文 为什么要全局统一异常处理呢?如果系统发生了异常,不做统一异常处理,前端会给用户展示一大片看不懂的文字。做统一异常处理后当

    spring boot系列4-定时任务-springboot自带的scheduled超级简单

    需求:创建一个每天凌晨0点执行的定时任务1.创建任务 /** * @author 天空蓝蓝的 */ @Slf4j @EnableScheduling @Component public class MyTask { @Async @Schedul...

    Spring Boot系列5-定时任务-springboot整合quartz实现动态定时任务

    MyJob实现Job接口,重写execute方法在里面操作我们要执行的业务逻辑。 @Slf4j public class MyJob implements Job { @Autowired private MyService myService;...

    SpringBoot系列19-防止重复请求,重复表单提交超级简单注解的实现之四(终极版II)

    前言: 根据最新spring boot:2.5.0版本和在《SpringBoot防止重复请求,重复表单提交超级简单的注解实现之四(终极版I)》之上化繁为简抽取更实用的代码,新增超时机制 防重复提交

    win10如何彻底关闭自动更新

    缘由:win10的自动更新是默认开启的,一有新版本就会提示更新,并且有时候更新会占用很长一段时间。如何彻底关闭自动更新呢? 方法:这里列举一个比较简单的方法 1.键盘同时按下 【win+R】 打开

    springboot项目运行在docker中 file.exists()返回false没有报错

      springboot项目运行在docker中 file.exists()返回false没有报错   表现:在windows运行正确,但是打包后运行在docker容器中找不到

    spring boot系列3-四步完成观察者事件发布接收(发送消息接收消息)使用异步方不阻塞主线程

    1.首先Application开启异步 @SpringBootApplication @EnableAsync public class DemoApplication { public static void main(String[] arg...

    SpringBoot系列12-redis-pipeline keys模糊查询替代方案

    keys模糊查询遇到性能问题redis cup 99%以及解决方案 之前写过一篇文章 《java redis通过key模糊删除,批量删除,批量查询相关数据》,在项目中我也是这样使用的。刚开始还没有什么问题,后来数据多了,服务器redis cup ...

    SpringBoot系列14-加载yml,properties配置文件信息

    yml前置知识 yml语法: 单个key value 写法 k:空格v eg: color: blue 对象写法 k: {k1: v1,k2: v2} k: k1: v1 k2: v2 list集合写法 k: [v1,v2,v3] k: -...

    加入公众号
    加入公众号