这篇文章承接上篇文章,没有看过的小伙伴可以先去看上篇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有两种方法
- 通过Mono静态方法创建:
-
empty():创建一个不包含任何元素,只发布结束消息的序列。
-
just():可以指定序列中包含的全部元素。创建出来的 Mono序列在发布这些元素之后会自动结束
-
justOrEmpty():从一个 Optional 对象或可能为 null 的对象中创建 Mono。只有 Optional 对象中包含值或对象不为 null 时,Mono 序列才产生对应的元素。
-
error(Throwable error):创建一个只包含错误消息的序列。
-
never():创建一个不包含任何消息通知的序列。
ps:
Mono.justOrEmpty(userDao.findById(id));
- 通过 create()方法来使用 MonoSink 来创建 Mono。
ps:
Mono.create(userMonoSink -> userMonoSink.success(userDao.save(user)));
Flux
Flux 是表示包含 0 到 N 个元素的异步序列
有个大概的认识就差不多了,先上代码
这里照例使用的是模拟的数据,不连接数据库,以免增加上手难度
- 工具类
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) ;
}
}
-
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版本中会有失效的情况,在这里请教下解决方案 3. 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);
}
}
-
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))); } } -
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请求