专栏首页java闲聊SpringWebFlux(下篇)

SpringWebFlux(下篇)

这篇文章承接上篇文章,没有看过的小伙伴可以先去看上篇SpringFlux入门(上篇),涉及到的两个重要的对象,Flux和Mono来看下官网是怎么介绍的

Reactor is the reactive library of choice for Spring WebFlux. It provides the Mono and Flux API types to work on data sequences of 0..1 and 0..N 
中文意思:
Reactor是Spring WebFlux的首选反应式编程库。 它提供Mono和Flux API类型来处理0..1和0..N的数据序列

文章末尾会附上官网链接地址

Mono

素材来自官网

Mono 是表示包含 0 或者 1 个元素的异步序列

创建Mono有两种方法

  1. 通过Mono静态方法创建:
  • empty():创建一个不包含任何元素,只发布结束消息的序列。
  • just():可以指定序列中包含的全部元素。创建出来的 Mono序列在发布这些元素之后会自动结束
  • justOrEmpty():从一个 Optional 对象或可能为 null 的对象中创建 Mono。只有 Optional 对象中包含值或对象不为 null 时,Mono 序列才产生对应的元素。
  • error(Throwable error):创建一个只包含错误消息的序列。
  • never():创建一个不包含任何消息通知的序列。

ps: Mono.justOrEmpty(userDao.findById(id));

  1. 通过 create()方法来使用 MonoSink 来创建 Mono。

ps:

Mono.create(userMonoSink -> userMonoSink.success(userDao.save(user)));

Flux

 Flux 是表示包含 0 到 N 个元素的异步序列

素材来自官网

有个大概的认识就差不多了,先上代码

这里照例使用的是模拟的数据,不连接数据库,以免增加上手难度

  1. 工具类
package com.tanoak.utils;

import com.google.common.collect.Lists;
import com.tanoak.pojo.User;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author tanoak@qq.com
 * @Desc 模拟数据类
 */
public class DataUtils {
    public static  List<User> users =new ArrayList<>() ;;

    public static Map<Long,User> userMap =new HashMap<>();
    static {
        User user1 = new User(1L,"张三") ;
        User user2 = new User(2L,"李四") ;
        User user3 = new User(3L,"王五") ;
        users.add(user1);
        users.add(user2) ;
        users.add(user3) ;
        userMap.put(1L,user1) ;
        userMap.put(2L,user2) ;
        userMap.put(3L,user3) ;
    }

    public static List<User> listUser(){
    return users ;
    }
    public static User findById(Long id){
        return userMap.get(id) ;
    }

}
  1. pojo层

package com.tanoak.pojo;

import lombok.Data;

/**

  • @author tanoak@qq.com
  • @Desc */ //@Data public class User { private Long id ; private String name ; public User() { } public User(Long id, String name) { this.id = id; this.name = name; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + ''' + '}'; } }

Lombok在IDEA 18.1版本中会有失效的情况,在这里请教下解决方案

  1. Dao层 package com.tanoak.demo1.dao; import com.tanoak.pojo.User; import com.tanoak.utils.DataUtils; import org.springframework.stereotype.Component; import java.util.List; /** * @author tanoak@qq.com * @Desc */ @Component public class UserDao { public Integer save(User user){ if(null==user){ return 0 ; } System.out.println("保存成功"); return 1 ; } public Integer del(Long id){ if(null!=id){ System.out.println("删除成功"); return 1 ; } return 0 ; } public Integer update(User user){ if(null==user){ return 0 ; } System.out.println("修改成功"); return 1 ; } public List<User> findAll(){ return DataUtils.listUser() ; } public User findById(Long id){ return DataUtils.findById(id); } }
  2. handle层 package com.tanoak.demo1.handler; import com.tanoak.demo1.dao.UserDao; import com.tanoak.pojo.User; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import javax.annotation.Resource; /** * @author 656443534@qq.com * @Desc 增删查改 可以把它当成Service层 */ @Component public class UserHandler { @Resource private UserDao userDao; public Mono<Integer> save(User user) { return Mono.create(userMonoSink -> userMonoSink.success(userDao.save(user))); } public Mono<Integer> del(Long id) { return Mono.create(userMonoSink -> userMonoSink.success(userDao.del(id))); } public Mono<User> findById(Long id) { return Mono.just(userDao.findById(id)); } public Flux<User> findAll() { return Flux.fromIterable(userDao.findAll()); } public Mono<Integer> update(User user) { return Mono.create(userMonoSink -> userMonoSink.success(userDao.update(user))); } }
  3. Controller层 package com.tanoak.demo1.controller; import com.tanoak.demo1.handler.UserHandler; import com.tanoak.pojo.User; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import javax.annotation.Resource; /** * @author 656443534@qq.com * @date 2018/5/20 15:51 * @Desc REST风格 */ @RestController @RequestMapping("/user") public class UserController { @Resource private UserHandler userHandler ; @PostMapping() public Mono<Integer> save(@RequestBody User user) { return userHandler.save(user) ; } @GetMapping("{id}") public Mono<User> query(@PathVariable("id")Long id) { return userHandler.findById(id) ; } @GetMapping() public Flux<User> queryAll() { return userHandler.findAll() ; } @DeleteMapping("{id}") public Mono<Integer> del(@PathVariable("id")Long id) { return userHandler.del(id) ; } @PutMapping() public Mono<Integer> update(@RequestBody User user) { return userHandler.update(user) ; } }

使用PostMan进行测试,这里截取发送POST请求与DELETE请求

至此一个简单的CRUD项目就完成了,在这里不涉及到数据库,DataUtils充当了数据库,在实际应用中个人感觉距离生产环境还有一段路要走,但是github上已经有关于异步jdbc的解决方案,等后面我研究后再分享出来吧! 异步JDBC项目地址:https://github.com/mauricio/postgresql-async 异步jdbc与同步性能对比 官网资料: WebFlux官网资料 Flux官网资料 Mono官网资料 参考博客: 泥瓦匠BYSocket

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot Redis 2.0.x

    在笔者之前的文章中有介绍redis的安装,不会的可以去看 笔者之前写的文章redis安装

    tanoak
  • SpringBoot Cache 入门

    @CacheEvict(cacheNames = "tea",key = "#id")

    tanoak
  • 设计模式之适配器模式适配器模式

    当我们的手机接口Type-A时,但是数据线只有Type-C的时候,就需要用转接口做适配,这种情况下就要增加一个适配器

    tanoak
  • WebFlux拨云见日之前端整合,悟了吗? 顶

            从spring5中加入webflux的消息现世已经有一段时间了,也发现了一些朋友的公司在使用webfux,但是大多数都是用作为服务器之间的一些通...

    kinbug [进阶者]
  • Springboot 整合jpa的使用

    用户5927264
  • MyBatis多表查询

    MyBatis的多表查询只需要DAO接口和sql语句即可,主要的是mapper里的返回字段要正确

    用户3112896
  • JavaWeb(九)AJAX

    Ajax ajax:AJAX 是与服务器交换数据的艺术,它在不重载全部页面的情况下,实现了对部分网页的更新 AJAX:Asynchronous JavaScri...

    二十三年蝉
  • spring的简易实现(一)

    在第一部分我们实现读取xml的配置,然后实例化xml中的bean 首先定义一个xml和相关的class类

    Theone67
  • Spring全家桶之SpringBoot——初级阶段

    • Spring Boot 设计目的是用来简化新Spring 应用的初始搭建以及开发过程。 • 嵌入的Tomcat,无需部署WAR 文件 • Spring ...

    时间静止不是简史
  • springmvc-mybatis

    本文基于原文http://doc.okbase.net/fengshizty/archive/126397.html配置环境。 首先说说几个问题 1.关于Myb...

    DuncanZhou

扫码关注云+社区

领取腾讯云代金券