Spring MVC 和 Spring WebFlux 都是 Spring 框架中的 Web 开发框架,其中 Spring MVC 是基于 Servlet API 实现的同步 Web 框架,而 Spring WebFlux 则是基于 Reactor 的异步响应式编程模型实现的 Web 框架。它们在功能和编写方面有以下几点差异:
- 功能差异 Spring MVC 是一种同步阻塞的 Web 框架,它是基于 Servlet API 实现的,主要用于构建传统的 Web 应用程序。而 Spring WebFlux 则是一种异步非阻塞的 Web 框架,它基于 Reactor 和 Reactive Streams 实现,主要用于构建高吞吐量、低延迟的 Web 应用程序。
- 编写差异 在 Spring MVC 中,我们通常会使用注解来标注控制器、请求映射、请求参数等,例如:
@RestController public class HelloController { @GetMapping("/hello") public String sayHello(@RequestParam(required = false, defaultValue = "World") String name) { return "Hello, " + name + "!"; } }
而在 Spring WebFlux 中,我们则需要使用函数式编程风格来编写控制器,例如:
@Configuration public class HelloConfiguration { @Bean public RouterFunction<ServerResponse> route(HelloHandler handler) { return RouterFunctions.route(RequestPredicates.GET("/hello") .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), handler::sayHello); } } @Component public class HelloHandler { public Mono<ServerResponse> sayHello(ServerRequest request) { String name = request.queryParam("name").orElse("World"); return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN) .body(BodyInserters.fromValue("Hello, " + name + "!")); } }
在上述代码中,HelloConfiguration 是一个配置类,用于配置路由,它使用 RouterFunction 来定义路由规则,并将路由规则与 HelloHandler 中的方法绑定。HelloHandler 则是一个控制器类,使用函数式编程风格编写了 sayHello() 方法,该方法使用 ServerRequest 获取请求参数,并使用 ServerResponse 返回响应结果。 综上所述,Spring MVC 和 Spring WebFlux 在功能和编写方面都有一定的差异,我们需要根据具体的应用场景来选择合适的框架。
-
在 Spring Boot 中,使用注解的方式编写 Spring WebFlux 和 Spring MVC 的代码有一些差异(差异不大),具体如下:
- 控制器注解不同 在 Spring MVC 中,我们通常使用 @Controller、@RestController、@RequestMapping 等注解来标记控制器类和处理请求方法:
@RestController @RequestMapping("/user") public class UserController { @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { // ... } @PostMapping("/") public User createUser(@RequestBody User user) { // ... } }
而在 Spring WebFlux 中,则需要使用 @Controller 或 @RestController 和 @RequestMapping 注解来标记控制器类和处理请求方法:
@RestController @RequestMapping("/user") public class UserController { @GetMapping("/{id}") public Mono<User> getUserById(@PathVariable Long id) { // ... } @PostMapping("/") public Mono<User> createUser(@RequestBody Mono<User> user) { // ... } }
需要注意的是,Spring WebFlux 中的请求处理方法需要返回 Mono 或 Flux 类型的对象,用于支持异步非阻塞的响应式编程模型。
-
2. 参数绑定注解不同
-
在 Spring MVC 中,我们可以使用 @PathVariable、@RequestParam、@RequestBody 等注解来绑定请求参数:
@GetMapping("/{id}") public User getUserById(@PathVariable Long id, @RequestParam(required = false) String name) { // ... } @PostMapping("/") public User createUser(@RequestBody User user) { // ... }
-
而在 Spring WebFlux 中,则需要使用 @PathVariable、@RequestParam、@RequestBody 注解来绑定请求参数,并且 @RequestParam 注解需要指定参数名称:
@GetMapping("/{id}") public Mono<User> getUserById(@PathVariable Long id, @RequestParam(required = false, name = "name") String name) { // ... } @PostMapping("/") public Mono<User> createUser(@RequestBody Mono<User> user) { // ... }
需要注意的是,Spring WebFlux 中的请求参数绑定需要使用 Mono 或 Flux 类型的对象,用于支持异步非阻塞的响应式编程模型。 综上所述,在 Spring Boot 中,使用注解的方式编写 Spring WebFlux 和 Spring MVC 的代码有一些差异,我们需要根据具体的应用场景来选择合适的框架。