webflux

本文介绍了WebFlux框架,一种基于Reactor的异步非阻塞编程模型,讲解了同步异步、阻塞非阻塞的区别,并详细阐述了Reactor的Mono和Flux概念,以及如何在Spring Boot中使用SpringWebFlux进行注解编程。通过实例展示了UserService的CRUD操作和测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


webflux介绍
webflux是一种异步非阻塞的框架,其核心是基于Reactor相关api实现的响应式编程。

相关概念

同步和异步:调用者发送请求,如果等待对方回应之后再去做其他事情就是同步。如果不等待对方回应就去做其他事情就是异步。
阻塞(需等待)和非阻塞(不需等待):调用者收到请求之后,做完任务再反馈是阻塞。先反馈在完成任务是非阻塞。

响应式编程(reactor实现)

响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。

reactor概念

reactor的发布者用两个类表示:
Mono(返回0或1个元素)
Flux(返回0-n个元素)

三种数据信号:元素值、错误信号、终止信号。
操作符map和flatmap:
map:元素映射为新元素。
flatmap:元素映射为流。

springWebFlux(基于注解编程模型)

1、导包

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.itlym.shoulder</groupId>
            <artifactId>lombok</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>

2、MVC结构

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private String gender;
    private int age;
}
public interface UserService {
    Mono<User> findById(int id);
    Flux<User> findAll();
    Mono<Void> addUser(Mono<User> user);
}
@Service
public class UserServiceImpl implements UserService {
    private final Map<Integer,User> users=new HashMap<>();

    public UserServiceImpl() {
        this.users.put(1,new User("lucy","男",15));
        this.users.put(2,new User("marry","女",23));
        this.users.put(3,new User("jack","男",31));
        this.users.put(4,new User("tom","女",29));
    }

    @Override
    public Mono<User> findById(int id) {
        return Mono.justOrEmpty(this.users.get(id));
    }

    @Override
    public Flux<User> findAll() {
        return Flux.fromIterable(this.users.values());
    }

    @Override
    public Mono<Void> addUser(Mono<User> userMono) {
        return userMono.doOnNext(person->{
            int id = users.size()+1;
            users.put(id,person);
        }).thenEmpty(Mono.empty());
    }
}
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    @RequestMapping("/user/{id}")
    public Mono<User> findId(@PathVariable Integer id){
        return userService.findById(id);
    }
    @RequestMapping("/user")
    public Flux<User> getAll(){
        return userService.findAll();
    }
    @PostMapping("/save")
    public Mono<Void> saveUser(@RequestBody User user){
        Mono<User> just = Mono.just(user);
        return userService.addUser(just);
    }
}

3、测试
浏览器访问:https://localhost:8081/user/1

  • 计划任务
  • 完成任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值