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
英文地址,請注明出處:http://en.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…