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

SpringWebFlux(下篇)_第1张图片
素材来自官网
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 个元素的异步序列
SpringWebFlux(下篇)_第2张图片
素材来自官网

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

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

  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 [email protected]
 * @Desc 模拟数据类
 */
public class DataUtils {
    public static  List users =new ArrayList<>() ;;

    public static Map 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 listUser(){
    return users ;
    }
    public static User findById(Long id){
        return userMap.get(id) ;
    }

}

  1. pojo层

package com.tanoak.pojo;

import lombok.Data;

/**

  • @author [email protected]

  • @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 [email protected]
     * @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 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 [email protected]
     * @Desc 增删查改 可以把它当成Service层
     */
    @Component
    public class UserHandler {
    
     @Resource
     private UserDao userDao;
    
     public Mono save(User user) {
         return Mono.create(userMonoSink -> userMonoSink.success(userDao.save(user)));
     }
    
     public Mono del(Long id) {
         return Mono.create(userMonoSink -> userMonoSink.success(userDao.del(id)));
     }
    
    
     public Mono findById(Long id) {
         return Mono.just(userDao.findById(id));
     }
    
     public Flux findAll() {
         return Flux.fromIterable(userDao.findAll());
     }
    
     public Mono 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 [email protected]
     * @date 2018/5/20 15:51
     * @Desc REST风格
     */
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
     @Resource
     private UserHandler userHandler ;
    
     @PostMapping()
     public Mono save(@RequestBody User user) {
         return userHandler.save(user) ;
    
     }
     @GetMapping("{id}")
     public Mono query(@PathVariable("id")Long id) {
         return userHandler.findById(id) ;
     }
    
     @GetMapping()
     public Flux queryAll() {
         return userHandler.findAll() ;
     }
    
     @DeleteMapping("{id}")
     public Mono del(@PathVariable("id")Long id) {
         return userHandler.del(id) ;
     }
    
     @PutMapping()
     public Mono update(@RequestBody User user) {
         return userHandler.update(user) ;
     }
    }
    
    

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

SpringWebFlux(下篇)_第3张图片

SpringWebFlux(下篇)_第4张图片

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

你可能感兴趣的:(SpringWebFlux(下篇))