查看原文
其他

SpringBoot WebFlux 入门案例

biubiu SpringForAll社区 2020-10-17

为什么要使用WebFlux

1.WebFlux异步编程,拥有更好的性能

2.WebFlux完全基于java8开发,在编写代码时可以更加简洁明了

例如(官网图):

  • 以前的风格

  • WebFlux风格

WebFlux入门案例

WebFlux主要基于Reacotr,下面代码一段入门demo,分别使用Mono和Flux


  • 代码示例:

  1. @Data

  2. @AllArgsConstructor

  3. @NoArgsConstructor

  4. @Builder

  5. publicclassUser{

  6.  privateInteger userId;

  7.  privateString username;

  8. }

  1. @RestController

  2. @RequestMapping("/user")

  3. public class UserController {

  4.    private Map<Integer, User> userMap = new HashMap<>();

  5.    @PostConstruct

  6.    public void init(){

  7.        userMap.put(1,new User(1,"zhangsan"));

  8.        userMap.put(2,new User(2,"lisi"));

  9.    }

  10.    @GetMapping("/find")

  11.    public Flux<User> findAll(){

  12.        return Flux.fromIterable(userMap.entrySet().stream()

  13.                                .map(k -> k.getValue())

  14.                                .collect(Collectors.toList()));

  15.    }

  16.    @GetMapping("/{id}")

  17.    public Mono<User> findByUserId(@PathVariable Integer id){

  18.        return Mono.just(userMap.get(id));

  19.    }

  20. }


  • 测试代码:

    测试结果:

  1. @RunWith(SpringRunner.class)

  2. @WebFluxTest

  3. publicclassSpringBootTestApplicationTests{

  4.  @Autowired

  5.  privateWebTestClient webTestClient;

  6.  @Test

  7.  publicvoid findAllTest(){

  8.      EntityExchangeResult<List<User>> exchangeResult = webTestClient.get().uri("/user/find")

  9.              .accept(MediaType.APPLICATION_JSON_UTF8)

  10.              .exchange()

  11.              .expectStatus().isOk()

  12.              .expectBodyList(User.class)

  13.              .returnResult();

  14.      exchangeResult.getResponseBody().forEach(System.out::println);

  15.  }

  16.  @Test

  17.  publicvoid findByIdTest(){

  18.      EntityExchangeResult<User> exchangeResult = webTestClient.get().uri("/user/{id}",2)

  19.              .accept(MediaType.APPLICATION_JSON_UTF8)

  20.              .exchange()

  21.              .expectStatus().isOk()

  22.              .expectBody(User.class)

  23.              .returnResult();

  24.      System.out.println(exchangeResult.getResponseBody().getUsername());

  25.  }

  26. }

WebFlux Mono Flux使用场景

基于上面的示例,读者可能会有如下疑惑,什么时候使用Mono,什么时候使用Flux?


  • Mono:

    在发布单个元素事件的时候使用Mono


  • Flux:

    在发布多个元素事件的时候使用Flux


推荐: 【SFA官方译】:使用Spring Security保护REST API

上一篇:在SpringBoot中优雅的使用Spring Security OAuth 2

关注公众号

点击原文阅读更多


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存