Spring WebFlux是一套全新的Reactive Web技术栈,实现完全非阻塞、支持Reactive Streams、背压等特性,而且运行的环境除了Servlet容器(Tomcat、Jetty、Undertow),还有Netty等。WebFlux可以和WebMVC共存,在springboot中,mvc的优先级更高。
编程模型
编程模型有两种,注解驱动和函数式编程
WebFlux与WebMVC在注解驱动方面的异同:
定义:都是@Controller或@RestController
映射:都是@RequestMapping、@GetMapping、@PostMapping等等
请求:都是@RequestParam、@RequestHeader、@CookieValue、@RequestBo、@PathVariable、RequestEntity
响应:都是@ResponseBody、ResponseEntity、ResponseCookie
拦截:都是@ControllerAdvice、@RestControllerAdvice
跨域:跨域方面有差异
特性 | Spring Web MVC | Spring WebFlux |
资源跨域声明注解 | @CrossOrigin | 相同 |
资源跨域拦截器 | CorsFilter | CorsWebFilter |
注册资源跨域信息 | webMvcConfigurer#addCorsMappings | WebFluxConfigurer#addCorsMappings |
关于函数式编程
函数式编程是java1.8引入的新特性,在之前其实我们就已经用过了。函数式编程的接口必须有@FunctionalInterface注解,进去看这个注解的源码
看注释可以知道:这是用于函数式接口类型生命的信息性注解类型,这种接口只能有一个抽象方法,因为接口都有个默认方法Method#isDefault,所以这个方法也需要被覆盖。并且@FunctionalInterface不能标注在注解、类或枚举上。否则就不能被视为函数是接口,引起编译错误。函数是借口可以使用lambda表达式、方法引用或构造器