Spring Boot `@Service` 互相調用全攻略:`@Autowired` vs `@Resource`

Spring Boot @Service 互相調用全攻略:@Autowired vs @Resource

在日常寫 Spring Boot 項目的時候,經常會遇到一個問題:多個 @Service 之間需要互相調用,到底該怎么寫才優雅?用 @Autowired?用 @Resource?循環依賴怎么辦?

本文就帶你一口氣整清楚,并配合 Demo 來對比,最后還會總結最佳實踐。


在這里插入圖片描述

1. 基礎:@Service 是什么?

在 Spring 里,@Service 其實就是一個 特殊的 Bean。它被 Spring 容器管理,創建、銷毀、注入都由 Spring 來完成。
所以,不管你用 @Autowired 還是 @Resource,本質上都是 依賴注入(Dependency Injection)


2. @Autowired:Spring 派來的助手

2.1 特點

  • 默認按照 類型(byType)注入;
  • 如果有多個同類型的 Bean,會報錯,需要用 @Qualifier 指定;
  • 支持構造器、字段、Setter 注入;
  • 可以加 required = false,讓依賴變成可選。

2.2 Demo

@Service
public class UserService {public String getUserName(Long id) {return "User-" + id;}
}@Service
public class OrderService {private final UserService userService;// 構造器注入(推薦 ?)@Autowiredpublic OrderService(UserService userService) {this.userService = userService;}public void createOrder(Long userId) {System.out.println("訂單用戶: " + userService.getUserName(userId));}
}

3. @Resource:JDK 官方背書

3.1 特點

  • 來自 JSR-250 標準,算是“官方背書”;
  • 默認按照 名稱(byName)注入,找不到時再按照類型;
  • 常用在字段 / Setter 注入;
  • 不支持 required = false

3.2 Demo

@Service
public class UserService {public String getUserName(Long id) {return "User-" + id;}
}@Service
public class OrderService {@Resourceprivate UserService userService; // 按字段名 userService 找 Beanpublic void createOrder(Long userId) {System.out.println("訂單用戶: " + userService.getUserName(userId));}
}

3.3 多實現類場景

@Service("vipUserService")
public class VipUserService extends UserService {@Overridepublic String getUserName(Long id) {return "VIP-" + id;}
}@Service
public class OrderService {@Resource(name = "vipUserService")private UserService userService;public void createOrder(Long userId) {System.out.println("訂單用戶: " + userService.getUserName(userId));}
}

4. 循環依賴問題

有時候,你寫著寫著,就會掉進一個坑:兩個 Service 互相依賴

@Service
public class AService {@Autowiredprivate BService bService;public void a() {System.out.println("A 調用");bService.b();}
}@Service
public class BService {@Autowiredprivate AService aService;public void b() {System.out.println("B 調用");aService.a();}
}

結果:啟動失敗,提示循環依賴。

4.1 循環調用的可視化

AServiceBService調用 b()調用 a()再次調用 b()再次調用 a()無限遞歸,最終 StackOverflow 或啟動失敗AServiceBService

4.2 解決方法

  • 重構代碼(最佳 ?):抽出公共邏輯放到 CService,避免直接互調。
  • 延遲注入(權宜之計):在其中一個依賴上加 @Lazy
@Service
public class BService {private final AService aService;public BService(@Lazy AService aService) {this.aService = aService;}public void b() {System.out.println("B 調用");aService.a();}
}

5. 總結:到底用哪個?

  • 單實現類場景
    @Autowired@Resource 都行,推薦 構造器 + @Autowired

  • 多實現類場景
    @Resource(name="xxx") 更直觀;
    @Autowired + @Qualifier("xxx") 也可以。

  • 循環依賴
    優先考慮 重構;不得已時用 @Lazy


6. 最佳實踐建議

  1. 優先構造器注入,少用字段注入
    字段注入雖然寫起來爽,但對測試和維護都不友好。

  2. @Autowired vs @Resource 沒有絕對優劣

    • 傾向 Spring → 用 @Autowired
    • 傾向標準化 → 用 @Resource
  3. 不要用循環依賴當“快捷方式”
    那通常說明設計有問題。


@Autowired@Resource 之間糾結,遠不如搞清楚你的代碼結構更重要。
真正能寫好 Service 之間調用的,不是靠注解,而是靠 架構設計


實用小工具

App Store 截圖生成器、應用圖標生成器 、在線圖片壓縮和 Chrome插件-強制開啟復制-護眼模式-網頁亂碼設置編碼
乖貓記賬,AI智能分類的最佳聊天記賬App。
Elasticsearch可視化客戶端工具

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/923714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/923714.shtml
英文地址,請注明出處:http://en.pswp.cn/news/923714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c過渡c++應知應會(2)

c過渡c應知應會(2)1.缺省參數2.函數重載3.引用4.inline1.缺省參數 缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時,如果沒有指定實參,則采用該形參的缺省值,否則使用指定的實參,缺…

SSH連接排故排查

文章目錄SSH連接排故排查案例1:解決思路排故過程故障模擬SSH連接排故排查 案例1: 你是某在線教育公司的運維工程師,負責維護 3 臺應用服務器。今日上午 9 點,開發團隊反饋無法通過 SSH 連接 10.1.8.10 服務器部署代碼。該服務器…

Python爬蟲實戰——使用NetNut網頁解鎖器獲取亞馬遜電商數據的入門指南

摘要在當今數字化時代,電商數據蘊含著巨大的商業價值。亞馬遜作為全球知名的電商平臺,其上的商品信息、用戶評價等數據對于市場分析、競品研究等具有重要意義。然而,由于反爬蟲機制的存在,直接獲取亞馬遜電商數據并非易事。本文將…

汽車多核架構中內存系統故障檢測的改進算法

摘要隨著半導體行業向納米級方向發展,多核架構已成為主流趨勢。然而,這一趨勢也使得多核處理器面臨諸多挑戰,在一定程度上限制了其性能發揮。目前,汽車行業中的混合安全關鍵型系統普遍采用多核處理器。為滿足新興自動駕駛等級的需…

VastBase數據庫Crash后使用gdb收集coredump信息

VastBase數據庫Crash后使用gdb收集coredump信息🐘 數據庫版本:VastBase G100 V3.0.8檢查數據庫崩潰后生成的core文件: [vbdbadbhost vastbase]$ ll -h core* -rw------- 1 vbdba vbdba 62G Aug 20 20:02 core-vastbase-162199-2025_08_20_19_…

【LeetCode 每日一題】2749. 得到整數零需要執行的最少操作數

Problem: 2749. 得到整數零需要執行的最少操作數 文章目錄整體思路完整代碼時空復雜度時間復雜度:O(1)空間復雜度:O(1)整體思路 這段代碼旨在解決一個具有數學和位運算性質的問題:給定兩個整數 num1 和 num2,找到最小的正整數 k&…

安卓開發工程師中高級知識點 —— 系統底層安全方向

一、AIDL 通信 Android Interface Definition Language 基于 Binder 實現跨進程通信(IPC),核心是通過定義接口生成代理類,屏蔽底層 Binder 通信細節 適用于跨進程服務調用(如系統服務、多App協作)。常見于后…

動環監控系統-機房高效運維

動環監控系統(全稱為動力環境監控系統)是機房高效運維的核心工具,通過集成動力、環境、安防、IT設備等模塊,結合智能告警、AI分析、3D可視化等技術,實現機房的全方位監控與管理。動力系統監控供電設備:實時…

知微傳感Dkam系列3D相機SDK例程篇:CSharp設置相機工作模式

設置3D相機觸發模式 寫在前面 本人從事機器視覺細分的3D相機行業。編寫此系列文章主要目的有: 1、便利他人應用3D相機,本系列文章包含公司所出售相機的SDK的使用例程及詳細注釋;2、促進行業發展及交流。設置觸發模式及API說明 觸發模式說明 知…

PHP 常用函數及用法

文章目錄PHP 常用函數及用法一、字符串處理函數1. 字符串基礎操作2. 字符串查找與替換3. 字符串分割與連接4. 字符串大小寫轉換5. 字符串格式化二、數組操作函數1. 數組基礎操作2. 數組遍歷與查找3. 數組修改與排序4. 數組過濾與合并三、文件操作函數1. 文件讀寫2. 文件和目錄信…

yum命令--obsoletes與--allowerasing兩者的區別

在 YUM(Yellowdog Updater Modified)包管理工具中,–obsoletes 和 --allowerasing 是兩個與包升級 / 安裝相關的選項,它們的功能和使用場景有明顯區別: 1. --obsoletes(默認啟用)作用&#xff1…

Day24_【深度學習(3)—PyTorch使用(1)—張量的創建和類型轉換】

一、創建張量1.張量基本創建方式torch.tensor 根據指定數據創建張量 (最重要)torch.Tensor 根據形狀創建張量, 其也可用來創建指定數據的張量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 創建指定類型的張量1.1 torch.tensor# 方式一&…

阿里云圖像編輯大模型開發部署

與阿里云一起輕松實現數智化讓算力成為公共服務:用大規模的通用計算,幫助客戶做從前不能做的事情,做從前做不到的規模。讓數據成為生產資料:用數據的實時在線,幫助客戶以數據為中心改變生產生活方式創造新的價值。圖像…

查看磁盤分區并新建一個分區,掛載分區

linux系統磁盤df -h查看文件系統的磁盤的空間占用情況,常用于快速檢查磁盤使用率:df -h-h是說把磁盤空間以G位單位,如果直接用df也是可以的,只不過單位是塊,看的不明顯du -sh /home/查看/home目錄下總共占用了多大的空…

vscode單擊暫時預覽文件 雙擊持續打開文件

直接單擊文件列表中的文件,會在編輯器中以預覽模式打開 文件標簽會顯示為斜體,表示是預覽狀態 當您單擊另一個文件或開始編輯時,預覽文件會自動關閉 在 settings.json 中添加,mac通過cmd,實現。 json {"workbench.editor.ena…

設計模式-橋接模式04

什么是橋接模式? 橋接模式就是把事物的兩個方面(兩個變化的維度)分開管理,讓它們可以分別自由變化,然后通過一個“橋”把它們連接起來。舉個生活中的例子 想象一下你在買鞋子: 鞋子有不同的款式&#xff08…

群暉企業級NAS :從中小企業效率工具到核心業務數據基石

在數字化轉型加速的今天,數據已成為企業最核心的資產。全球超半數財富 500 強企業選擇群暉(Synology)作為數據管理伙伴,其企業級 NAS 解決方案憑借 DSM 操作系統的生態優勢、硬件與軟件的深度協同,以及覆蓋全場景的產品…

C++訪問限定符private、public、protected的使用場景

C 訪問控制關鍵字:public、private、protected 在C中,public、private和protected是訪問控制關鍵字,用于實現面向對象編程的封裝特性,控制類成員的訪問權限。 訪問控制關鍵字的使用場景 1. public(公有成員&#xff09…

CKA08--PVC

Task mariadb namespace 中的 MariaDB Deployment 被誤刪除。請恢復該 Deployment 并確保數據持久性。 請按照以下步驟: 如下規格在 mariadb namespace 中創建名為 mariadb 的 PersistentVolumeClaim (PVC): 訪問模式為 ReadWriteOnce 存儲為 250Mi 集群…

Freertos系列(調度機制與創建任務)

如果不想看的可以直接使用git把我的代碼下載出來,里面工程挺全的,后期會慢慢的補注釋之類的 碼云地址:stm32學習筆記: stm32學習筆記源碼 如果不會使用git快速下載可以選擇直接下載壓縮包或者去看看git的使用 Git入門教程-CSDN博客 一 調…