You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@GetMapping与@GetExchange的区别及适用场景探讨

@GetMapping 与 @GetExchange 的区别及使用场景

Spring 6 引入了 @GetExchange、@PostExchange 等一系列注解,和此前已有的 @GetMapping、@PostMapping 功能看似相似,但定位和用途完全不同,下面分问题说明:

1. 两个注解的核心区别

  • 所属模块与定位不同
    • @GetMapping 属于 spring-web 模块,是为Spring MVC服务端控制器设计的注解,用来定义服务端接收HTTP请求的映射规则。
    • @GetExchange 属于 spring-web-service 模块,是为声明式HTTP客户端设计的注解,用来描述客户端发起HTTP请求的规则。
  • 核心用途不同
    • @GetMapping 标记在 @RestController/@Controller 的方法上,告诉Spring MVC:这个方法是处理指定路径的GET请求的服务端端点。
    • @GetExchange 标记在普通接口的方法上,配合 HttpServiceProxyFactory 可以生成客户端代理,调用该方法时会自动发起对应的GET请求到目标服务。
  • 配置属性侧重不同
    • @GetMapping 的属性(比如 produces、consumes、params、headers)主要用来匹配服务端接收的请求,比如限制只能处理返回JSON的请求,或者携带特定参数的请求。
    • @GetExchange 的属性(比如 headers、contentType、accept、encoder、decoder)主要用来配置客户端发起的请求,比如设置请求头、指定请求/响应的编解码器。

2. 何时分别使用两个注解

  • 使用 @GetMapping 的场景
    当你开发Spring Boot/Spring MVC的服务端接口时,在 @RestController 或 @Controller 的方法上标记它,用来接收客户端的GET请求并处理业务逻辑、返回响应。比如写一个用户列表查询接口,就用 @GetMapping("/users")。

  • 使用 @GetExchange 的场景
    当你需要调用外部HTTP服务时,用声明式客户端的方式:先定义一个接口,在接口方法上用 @GetExchange 标记目标服务的路径,再通过 HttpServiceProxyFactory 创建这个接口的代理实例,之后调用接口方法就会自动发起GET请求到外部服务。比如调用第三方天气查询API的示例:

    import org.springframework.web.service.annotation.GetExchange;
    import reactor.core.publisher.Mono;
    
    public interface WeatherClient {
        @GetExchange("/weather?city={city}")
        Mono<WeatherResponse> getWeather(String city);
    }
    

    通过工厂生成代理后,直接调用 weatherClient.getWeather("Beijing") 就能发起请求。

注:你提供的示例中在 @RestController 里使用 @GetExchange 仅为展示注解写法,实际开发中不会这么用,因为 @GetExchange 并非为服务端控制器设计。

内容的提问来源于stack exchange,提问作者Alp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:40:01