@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
相关产品推荐
相关产品推荐

