SpringWebFlux(下篇)
这篇文章承接上篇文章,没有看过的小伙伴可以先去看上篇[SpringFlux入门(上篇)](https://www.jianshu.com/p/00b5a2899039),涉及到的两个重要的对象,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
![素材来自官网](https://upload-images.jianshu.io/upload_images/9819800-fc31d17da2ef8b8d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
```
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));
```
2. 通过 create()方法来使用 MonoSink 来创建 Mono。
ps:
```
Mono.create(userMonoSink -> userMonoSink.success(userDao.save(user)));
```
## Flux
```
Flux 是表示包含 0 到 N 个元素的异步序列
```
![素材来自官网](https://upload-images.jianshu.io/upload_images/9819800-fd234eac1b46af0f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
有个大概的认识就差不多了,先上代码
这里照例使用的是模拟的数据,不连接数据库,以免增加上手难度
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) ;
}
}
```
2. 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);
}
}
```
4. 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)));
}
}
```
5. 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请求
![](https://upload-images.jianshu.io/upload_images/9819800-65968544c12cc7e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/9819800-b219b69baf8f869b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
至此一个简单的CRUD项目就完成了,在这里不涉及到数据库,DataUtils充当了数据库,在实际应用中个人感觉距离生产环境还有一段路要走,但是github上已经有关于异步jdbc的解决方案,等后面我研究后再分享出来吧!
异步JDBC项目地址:[https://github.com/mauricio/postgresql-async](https://github.com/mauricio/postgresql-async)
[异步jdbc与同步性能对比](https://juejin.im/post/58fa9d1d0ce4630061200774)
官网资料:
[WebFlux官网资料](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-fn)
[Flux官网资料](https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html)
[Mono官网资料](https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html)
参考博客:
[[泥瓦匠BYSocket](https://www.bysocket.com/)
](https://www.bysocket.com/?p=1987)
- 点赞
- 收藏
- 关注作者
评论(0)