SpringMVC注解与SpringCloudOpenFeign注解对比

1. 背景知识

梳理SpringMVC和SpringCloudOpenFeign常用注解后:

  • Spring MVC中常用注解_笔记-CSDN博客
  • Spring Cloud OpenFeign 常用注解_笔记-CSDN博客

这里对两类注解做个对比。理解两者定位(服务端 vs 客户端)是掌握注解使用的关键:

  • Spring MVC注解用于服务端,描述如何解析一个HTTP请求;
  • OpenFeign注解用于客户端,描述如何构造一个HTTP请求(包括URL、参数、头、体等)

2.功能定位对比

特性Spring MVC 注解Spring Cloud OpenFeign 注解
定位方向服务端(接收请求)客户端(发送请求)
主要功能

处理传入的 HTTP 请求;

路由请求、解析请求参数、处理请求体、渲染响应等。

构建对外的 HTTP 请求;

将 Java 接口转化为 HTTP 请求,发送到远程服务端。

运行位置服务提供方服务消费方
典型场景暴露 REST API调用其他服务的 REST API

3.核心注解对比

3.1 请求映射

功能Spring MVCOpenFeign
类级别映射

@RestController

@RequestMapping

@FeignClient
方法级别映射@GetMapping/@PostMapping 等@GetMapping/@PostMapping 等
绑定路径变量@PathVariable@PathVariable(必须显式命名)

3.2 参数处理

参数类型Spring MVC(获取)OpenFeign(设置)
绑定查询参数自动绑定 POJO 或 @RequestParam@RequestParam 或 @SpringQueryMap
绑定请求体@RequestBody@RequestBody
绑定请求头@RequestHeader(获取请求头)@RequestHeader(在客户端设置请求头发送给服务端)
表单数据@ModelAttribute需自定义编码器
文件上传@RequestPart@RequestPart(需配置编码器)

3.3 特殊功能

功能Spring MVCOpenFeign
声明/@FeignClient(Feign特有,声明一个Feign客户端)
对象转查询参数自动绑定 POJO@SpringQueryMap(Feign特有,用于GET请求传递对象参数)
错误处理@ExceptionHandlerErrorDecoder 实现
熔断降级无原生支持(需整合)fallback/fallbackFactory(Feign特有)
请求拦截HandlerInterceptorRequestInterceptor
配置方式@ControllerAdvice@EnableFeignClients

4. 关键差异演示

4.1. URL路径差异

//Spring MVC:
@RestController
@RequestMapping("/users")
public class UserController {@GetMapping("/{id}")public User getUser(@PathVariable Long id) { ... }
}//Feign接口中必须指定完整路径(包括类上的路径),因为Feign不支持类级别的路径继承
@FeignClient(name = "user-service")
public interface UserClient {@GetMapping("/users/{id}")   // 这里必须写完整路径,包括类上没有公共前缀User getUser(@PathVariable("id") Long id); 
}

4.2. 参数处理差异 

//Spring MVC 注解用于获取参数(如使用@RequestHeader获取请求头)
@PostMapping("/users")
public User createUser(@RequestBody User user,@RequestHeader("X-Token") String token)
{...}// Feign注解用于设置参数(如使用@RequestHeader设置请求头)
@FeignClient(name="user-service")
public interface UserClient {
@PostMapping("/users")
User createUser(@RequestBody User user,@RequestHeader("X-Token") String token);
}

4.3. 路径变量处理差异

// Spring MVC(支持隐式绑定)
@GetMapping("/orders/{orderId}/items/{itemId}")
public Item getItem(@PathVariable Long orderId, @PathVariable String itemId) {...}// OpenFeign(@PathVariable 必须显式命名)
@FeignClient(name="order-service")
public interface OrderClient {@GetMapping("/orders/{orderId}/items/{itemId}")Item getItem(@PathVariable("orderId") Long orderId, @PathVariable("itemId") String itemId);
}

4.4. 查询参数处理差异

// Spring MVC(自动绑定POJO)
@GetMapping("/search")
public List<User> searchUsers(UserQuery query) {// 自动处理 ?name=xxx&age=xxx 到query的映射
}// OpenFeign(需要@SpringQueryMap注解)
@FeignClient(name="user-service")
public interface UserClient {@GetMapping("/search")List<User> searchUsers(@SpringQueryMap UserQuery query);//需要使用@SpringQueryMap注解构建query到 ?name=xxx&age=xxx 的映射
}

5. 二者协作演示

服务A:使用Spring MVC暴露API,服务端

// 服务A(使用Spring MVC暴露API,服务端)
@RestController
@RequestMapping("/products")
public class ProductController {@GetMapping("/{id}")public Product getProduct(@PathVariable Long id) {// 返回产品信息}@GetMapping("/search")public List<Product> searchProducts(ProductQuery query) {// 返回产品列表信息}
}

服务B:使用OpenFeign调用服务A, 客户端

// 服务B(使用OpenFeign调用服务A, 客户端)
@FeignClient(name = "product-service", configuration = FeignConfig.class)
public interface ProductClient {@GetMapping("/products/{id}")Product getProduct(@PathVariable("id") Long id);@PostMapping("/products/search")List<Product> searchProducts(@SpringQueryMap ProductQuery query);
}// 配置类
@Configuration
public class FeignConfig {// OpenFeign使用的拦截器为 RequestInterceptor@Beanpublic RequestInterceptor authInterceptor() {return template -> template.header("X-Auth", "token123");}
}// 调用示例
@Service
public class OrderService {private final ProductClient productClient;public Product getProductForOrder(Long productId) {return productClient.getProduct(productId);}
}

6.相关阅读

  • Spring MVC中常用注解_笔记
  • Spring Cloud OpenFeign 常用注解_笔记
  • Spring MVC拦截器:HandlerInterceptor介绍-笔记
  • OpenFeign拦截器:feign.RequestInterceptor 简介-笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90472.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 时间同步的流程

一、问题时间RTC时间、系统时间(UTC)和本地时间的关系如下&#xff1a;‌RTC时间‌&#xff08;硬件时钟&#xff09;&#xff1a;显示为UTC时间格式&#xff1a;02:50:35/02:51:28由主板电池供电&#xff0c;独立于系统运行‌12通常存储UTC时间&#xff08;Linux默认配置&…

VSCode——python选择解释器消失的解决办法

VSCode软件的左下角 设置——检查更新&#xff1a;

笛卡尔积规避:JOIN条件完整性检查要点

笛卡尔积是数据库查询中的高风险操作&#xff0c;多表JOIN时缺失有效关联条件会导致结果集指数级膨胀&#xff0c;引发‌性能塌方‌甚至系统崩溃‌。以下是核心检查策略及防御方案&#xff1a;一、笛卡尔积的致命影响‌‌性能塌方‌百万级订单表与千万级用户表缺失ON条件时&…

Vimba相机二次开发教程,基于Python

文章目录安装获取图像辅助数据Vimba 是由 Allied Vision 开发的一套软件开发套件&#xff08;SDK&#xff09;&#xff0c;主要用于控制和操作其工业相机产品。它提供了一套完整的 API 和工具&#xff0c;支持多种操作系统和编程语言&#xff0c;便于开发者快速集成相机功能到应…

电子测试行业软件ATECLOUD与ETEST对比分析-纳米软件

在当今科技飞速发展的时代&#xff0c;电测行业对于自动化测试平台的依赖程度日益加深。高效、精准的自动化测试平台不仅能够提升测试效率&#xff0c;还能确保产品质量。ATECLOUD 与 ETEST 作为电测行业中颇受瞩目的自动化测试平台&#xff0c;各自展现出独特的优势与特点。下…

自动化测试中的常见测试方法

自动化测试中的常见测试方法在自动化测试中&#xff0c;除了数据驱动&#xff08;Data-Driven Testing&#xff09;&#xff0c;还有多种主流方法&#xff0c;每种方法适用于不同场景和需求。以下是常见的自动化测试方法分类及详解&#xff1a;一、关键字驱动测试&#xff08;K…

口语01-don‘t judge a book by its cover

Dont judge a book by its cover 不要以貌取人1 the most advanced thing2 stack3 right4 frantically5 be annoyed with sb6 Get your stuff off my desk7 But today I came to class and was running a few minutes late.8 take my seat&#xff1a;占我座位 / 坐我的位置9 s…

《Uniapp-Vue 3-TS 实战开发》自定义预约时间段组件

这个组件可以直接在 uniapp 项目中使用,提供了 24 小时时段选择功能,支持单选 / 多选、预设时段选择、随机选择等功能。 html版本: <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="vi…

《Uniapp-Vue 3-TS 实战开发》自定义环形进度条组件

引言 在UniApp中使用Vue3和TypeScript开发环形进度条组件,我们可以考虑三种技术:Canvas、SVG和纯HTML(利用CSS)。考虑到兼容性、实现难度和效果,SVG是较好的选择。它可以轻松实现环形进度条,支持渐变色,并且可以通过属性精确控制进度,同时在不同分辨率屏幕上清晰显示…

MybatisPlus-17.扩展功能-JSON处理器

一.JSON处理器数据库中有的字段会以JSON格式来进行存储。类型为json类型。但是在java中我们没有这样的数据类型&#xff0c;一般会以字符串接收&#xff0c;这样就会导致如果想要从数据库中获取json格式中的key和value的话会比较麻烦&#xff0c;还要进行字符串操作。那么有没有…

【Web】DASCTF 2025上半年赛 wp

目录 phpms 再短一点点 泽西岛 phpms dirsearch请求太快会报429&#xff0c;要设置一手--delay&#xff0c;扫出来.git 跑一下githacker git stash list git stash show -p 注释的绕过参考&#xff1a;从国赛想到的一些php绕过注释符trick 发现很多函数都被disable了 这…

STM32-USART串口配置教程和printf函数实现(寄存器版)

本章概述思维导图通信介绍通信介绍概况通信&#xff0c;至少是需要两个对象&#xff0c;一个收一个发数据。根据数据通信的传输时序协调方式&#xff0c;可分为&#xff1a;同步通信和异步通信&#xff1b;根据数据通信的传输线路可分为&#xff1a;串行通信和并行通信&#xf…

4种灵活的方法从POCO手机中删除联系人

许多POCO用户经常需要清理联系人列表&#xff0c;删除重复或过时的条目&#xff0c;或者在出售或赠送手机之前删除个人或敏感联系人。无论是为了隐私、组织管理&#xff0c;还是仅仅是为了管理存储空间&#xff0c;高效地删除POCO手机中的联系人是至关重要的。本文将介绍4种智能…

航段导航计算机 (Segment_Navigator) 设计与实现

航段导航计算机 (Segment_Navigator) 设计与实现 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c;觉得好请收藏。点击跳转到网站。 1. 引言 航段导航计算机是现代航空电子系统中的关键组件&a…

input.1是onnx输入的名称,但是依然警告不是

导出动态轴的时候发现&#xff0c;明明input.1就是onnx的名字&#xff0c;但是依然有警告说不是&#xff1b;/miniconda3/envs/py38/lib/python3.8/site-packages/torch/onnx/utils.py:2078: UserWarning: Provided key input.1 for dynamic axes is not a valid input/output …

生成式人工智能展望报告-欧盟-02-技术方面

原文地址 摘要 本章的重点是GenAI的技术层面&#xff0c;首先是对其能力和局限性的评估。它强调了部署GenAI系统所带来的网络安全挑战。会议讨论了新出现的技术趋势&#xff0c;为决策者和利益攸关方提供了前瞻性的视角。关键问题包括确保GenAI应用程序的安全性和可靠性所需的…

人工智能与云计算双轮驱动:元宇宙如何重构全球产业生态

一、人工智能在元宇宙中的核心应用1. 内容生成与虚拟世界构建生成式AI&#xff08;AIGC&#xff09;&#xff1a;通过AI算法自动生成3D模型、虚拟场景和角色&#xff0c;显著降低内容制作成本和时间。例如&#xff1a;联想晨星元宇宙平台&#xff1a;利用AIGC技术实现低成本、高…

企业信息管理系统开发实战:基于 Spring Boot+MyBatis+Thymeleaf

引言&#xff1a;企业信息管理系统的核心价值在企业日常运营中&#xff0c;高效的信息管理是提升效率的关键。本文将手把手教你开发一套企业信息管理系统&#xff0c;涵盖用户登录、信息增删改查、权限控制等核心功能。系统采用 Spring Boot 作为后端框架&#xff0c;MyBatis 处…

NLP自然语言处理的一些疑点整理

PyTorch评估模式&#xff08;torch.no_grad和model.eval&#xff09;差异在PyTorch中&#xff0c;model.eval()和torch.no_grad()是模型评估和推理阶段的两个关键工具&#xff0c;它们各自扮演着不同的角色&#xff0c;但常常被一起使用以确保模型行为的正确性和计算效率。理解…

物流仓储自动化升级:Modbus TCP与DeviceNet的协议融合实践

一、项目背景在我们物流厂的日常运营中&#xff0c;分拣效率和仓储精准度一直是瓶颈。传统人工分拣不仅速度慢&#xff0c;还容易因疲劳出错&#xff1b;仓储区域的货物定位全靠人工记录&#xff0c;时常出现找货难、盘点耗时的问题。生产线的核心控制依赖施耐德PLC&#xff0c…