Spring Boot 2.x实战87 - 响应式编程2 - Spring WebFlux(类WebMVC注解式控制器、函数式端点、WebFlux的配置)

2. Spring WebFlux

新建应用,信息如下:

Group:top.wisely

Artifact:learning-webflux

Dependencies:Spring Reactive WebLombok

build.gradle文件中的依赖如下:

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-webflux'
   compileOnly 'org.projectlombok:lombok'
   annotationProcessor 'org.projectlombok:lombok'
	//...
}
2.1 WebFlux基础

Spring WebFlux不依赖于Servlet API,它可以运行在非Servlet容器Netty、Undertow和任何Servlet 3.1+的Servlet容器(Tomcat,Jetty)之上。虽然Servlet 3.1提供了非阻碍I/O的API,但是有很多其它的API依然是同步或阻碍式的;这使得Spring需要重新构建完全基于异步和非阻碍式的运行环境。

Spring WebFlux最底层的组件是HttpHandler,它用来适配不同的服务器引擎(Netty、Undertow、Tomcat、Jetty)。

在通过HttpHandler消除了服务器引擎的异构行后,Spring WebFlux的API设计与Spring MVC是高度一致的。

Spring WebFlux与Spring MVC在概念上有对应的关系:

Spring WebFlux Spring Web MVC
DispatcherHandler DispatcherServlet
WebFilter Filter
HttpMessageWriter
HttpMessageReader
HttpMessageConverter
HandlerMapping HandlerMapping
HandlerAdapter HandlerAdapter
ServerHttpRequest
ServerHttpResponse
ServletRequest
ServletResponse

Spring WebFlux支持两种编程模型:

  • 注解控制器:和Spring MVC使用的注解式保持一致。

    • RequestMappingHandlerMapping:映射请求与@RequestMapping控制器类和方法;
    • RequestMappingHandlerAdapter:调用@RequestMapping注解的方法。

    Sping MVC的两个类与这两个类名称一致,在不同的包里,有不同的实现,但功能保持一致。

  • 函数式端点:基于Lambada表达式、轻量级的函数式编程模型。

    • RouterFunctionMapping:用来支持RouterFunction
    • HandlerFunctionAdapter:用来支持HandlerFunctions

    从Spring 5.2或Spring 2.2.x以后Spring MVC也支持这种编程模型。

2.2 Spring Boot的自动配置

Spring Boot提供的自动配置主要有:

  • CodecsAutoConfiguration:Spring WebFlux使用HttpMessageReaderHttpMessageWriter接口来转换HTTP请求和返回。本配置类为我们注册了CodecCustomizer的Bean,默认使用Jackson2JsonEncoderJackson2JsonDecoder

  • ReactiveWebServerFactoryAutoConfiguration:为响应式Web服务器进行自动配置。

  • WebFluxAutoConfiguration:使用等同于@EnableWebFlux的配置开启WebFlux的支持。可通过WebFluxProperties使用spring.webflux.*来对WebFlux进行配置:

    spring:
      webflux:
        date-format: yyyy-MM-dd # 日期格式
        static-path-pattern: /resouces/static/** # 静态资源目录
    
  • WebClientAutoConfiguration:为WebClient进行自动配置。

2.2 注解控制器
2.2.1 示例

我们演示一个简单的例子,先定义简单的领域模型:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private Long id;
    private String name;
    private Integer age;
}
@RestController
@RequestMapping("/people")
public class PersonController {
   

    PersonRepository personRepository; //1

    public PersonController(PersonRepository personRepository) {
   
        this.personRepository = personRepository;
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Mono<Person> add(@RequestBody Person person){
    //2
        return Mono.just(personRepository.save(person));
    }

    @GetMapping("/{id}")
    public ResponseEntity<Mono<Person>> getById(@PathVariable Long id){
    //3
        return ResponseEntity.ok()
                .body(Mono.just(personRepository.findOne(id)));
    }
    @GetMapping
    public Flux<Person> list(){
    //4
        return Flux.fromIterable(personRepository.list());
    }

    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值