SpringMVC和SpringWebFlux在Springboot中的功能和编写方面的差异

Spring MVC 和 Spring WebFlux 都是 Spring 框架中的 Web 开发框架,其中 Spring MVC 是基于 Servlet API 实现的同步 Web 框架,而 Spring WebFlux 则是基于 Reactor 的异步响应式编程模型实现的 Web 框架。它们在功能和编写方面有以下几点差异:

  1. 功能差异 Spring MVC 是一种同步阻塞的 Web 框架,它是基于 Servlet API 实现的,主要用于构建传统的 Web 应用程序。而 Spring WebFlux 则是一种异步非阻塞的 Web 框架,它基于 Reactor 和 Reactive Streams 实现,主要用于构建高吞吐量、低延迟的 Web 应用程序。
  2. 编写差异 在 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 在功能和编写方面都有一定的差异,我们需要根据具体的应用场景来选择合适的框架。

  3. 在 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 的代码有一些差异,我们需要根据具体的应用场景来选择合适的框架。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值