【后端】Spring @Resource和@Autowired的用法和區別

以下是關于 @Resource@Autowired 兩個依賴注入注解的詳細對比說明,重點關注它們的區別和使用場景:


📌 核心區別總結

特性@Autowired (Spring)@Resource (JSR-250 標準)
來源Spring 框架原生注解Java 標準 (javax.annotation)
默認注入方式按類型 (byType)按名稱 (byName) → 按類型 (byType)
名稱指定需配合 @Qualifier("beanName")直接通過 name 屬性 (@Resource(name="beanName"))
是否支持可選依賴? 支持 (required=false)? 必須成功注入,否則報錯
構造器/參數注入? 支持構造器、方法參數、字段? 僅支持字段、Setter 方法
依賴范圍Spring 項目專屬通用(兼容 Spring/Jakarta EE 等)

🧩 詳細功能解析

1?? 注入方式
注解默認行為指定名稱的方法
@Autowired按類型```java
@Autowired
@Qualifier(“userDaoImpl”)
private UserDao userDao;
@Resource按名稱```java
@Resource(name=“userDaoImpl”)
private UserDao userDao;

? 推薦實踐

  • 存在同名多個 Bean 時優先用 @Resource(name="...")(簡潔)
  • 需要明確類型約束時用 @Autowired + @Qualifier
2?? 處理依賴缺失
// @Autowired 支持可選依賴
@Autowired(required = false)
private OptionalComponent component; // 允許為 null// @Resource 必須成功注入
@Resource
private MustExistBean bean; // 缺失時報錯
3?? 適用范圍
  • @Autowired
    ? 字段、構造器、Setter 方法、普通方法、參數
    @Autowired
    public UserService(UserRepo repo) { // 構造器注入this.repo = repo;
    }
    
  • @Resource
    ? 不支持構造器注入
    ? 僅支持字段和 Setter 方法
    @Resource
    public void setUserDao(UserDao dao) { // Setter 注入this.userDao = dao;
    }
    

🧪 使用場景建議

場景推薦注解原因
Spring 單體項目@AutowiredSpring 生態原生支持,功能更完整
多模塊/多數據源需明確指定@Resource直接通過 name 指定 Bean 更直觀簡潔 (@Resource(name="masterDB"))
需要可選依賴@Autowired支持 required=false
構造器注入@Autowired@Resource 不支持構造器
跨框架兼容項目@Resource遵循 JSR-250 標準,通用性更強

?? 常見問題避坑

多Bean沖突時的優先級
@Component("daoA")
class UserDaoA implements UserDao {}
@Component("daoB")
class UserDaoB implements UserDao {}// ? 明確指定名稱可避免歧義
@Service
public class UserService {@Resource(name="daoA")      // 指定使用 daoAprivate UserDao userDao;
}
多模塊掃描問題

若出現 NoSuchBeanDefinitionException

  • 檢查 @ComponentScan 是否覆蓋 Bean 所在的包
  • 多模塊項目中確保依賴的子模塊包含目標 Bean

🚀 終極選型建議

  1. 新 Spring 項目

    • 優先用 @Autowired:功能更全,支持構造器注入(官方推薦)
    • 配合 Lombok @RequiredArgsConstructor 實現不可變依賴:
      @Service
      @RequiredArgsConstructor
      public class UserService {private final UserRepo repo; // 自動構造器注入
      }
      
  2. 需明確指定名稱時
    使用 @Resource(name="...") 更簡潔

  3. 兼容 Jakarta EE/舊項目
    選擇 @Resource 保證跨環境兼容性


🌰 代碼對比示例

// 使用 @Autowired 按類型+名稱指定
@Service
public class UserService {@Autowired@Qualifier("mysqlUserRepo")private UserRepo userRepo;
}// 使用 @Resource 按名稱指定
@Service
public class UserService {@Resource(name = "mysqlUserRepo")private UserRepo userRepo;
}// 使用 @Autowired 構造器注入(推薦方式)
@Service
public class UserService {private final UserRepo userRepo;@Autowired // Spring 4.3+ 可省略public UserService(UserRepo userRepo) {this.userRepo = userRepo;}
}

最佳實踐

  • 強制依賴 → 構造器注入 (@Autowired)
  • 可選依賴 → 字段/Setter注入 (@Autowired(required=false))
  • 需要精確匹配名稱 → @Resource(name="...")

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

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

相關文章

php+apache+nginx 更換域名

phpapachenginx 更換域名? 第 1 步:確認到底是誰在監聽 80/443? 第 2 步:按監聽者修改配置🔹 場景 A:Apache 直接監聽 80/443🔹 場景 B:Nginx 監聽 80/443,反向代理到 Apache? 第 3 步&#…

AI 視頻衛士:AI 無人機巡檢,適配多元河道場景的治理利器

河道治理,場景各異,難題不同。城市內河的生活垃圾、景區河道的景觀破壞、工業園區河道的工業廢料,每一種場景都對巡檢工作有著獨特的要求。AI 視頻衛士,憑借強大的 AI 技術,針對不同河道應用場景,打造專屬巡…

累加和校驗原理與FPGA實現

累加和校驗原理與FPGA實現寫在前面一、基礎原理二、舉個例子2.1 進位累加2.2 回卷累加三、FPGA實現3.1 發送端(產生校驗和)3.2 接收端(累加和校驗)3.3 仿真結果寫在后面寫在前面 在上文《奇偶校驗原理與FPGA實現》中,講…

深入解析Go設計模式:命令模式實戰

什么是命令模式? 命令模式(Command Pattern)是一種行為型設計模式,它將請求封裝為獨立對象,從而允許客戶端通過不同的請求對象進行參數化配置。該模式支持請求的排隊執行、操作記錄以及撤銷等功能。 命令模式UML類圖如下所示: 命令模式包含五個核心角色,具體說明如下: …

Pytest項目_day11(fixture、conftest)

Fixture fixture是一種類似于setup、teardown,用于測試前后進行預備、清理工作的代碼處理機制 相比于setup、teardown來說,fixture命名更靈活,局限性更少使用conftest.py配置里面可以實現數據共享,不需要import就能自動找到一些配…

DAY 43 復習日

作業: kaggle找到一個圖像數據集,用cnn網絡進行訓練并且用grad-cam做可視化 劃分數據集 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader impo…

Flink運行時的實現細節

一、Flink集群中各角色運行架構先說Flink集群中的角色吧,有三個分別是客戶端(Client)、JobManager、TaskManager。客戶端負責接收作業任務并進行解析,將解析后的二進制數據發送給JobManager;JobManager是作業調度中心,負責對所有作…

思科、華為、華三如何切換三層端口?

三層交換機融合了二層交換技術與三層轉發技術,具備強大的網絡功能。主流廠商(思科、H3C、華為)的三層交換機均支持二層端口與三層端口的相互切換,但具體命令存在差異。本文將詳細介紹三大廠商設備的端口切換方法及相關知識。一、各…

springboot的基礎要點

Spring Boot 的核心設計理念是 ??"約定優于配置"??(Convention Over Configuration),旨在簡化 Spring 應用的初始搭建和開發過程。以下是需要掌握的核心基礎要點:?一、核心機制??自動配置 (Auto-Configuration)?…

lesson36:MySQL從入門到精通:全面掌握數據庫操作與核心原理

目錄 一、引言:為什么選擇MySQL? 二、MySQL安裝與登錄配置 2.1 環境準備 2.2 登錄指令詳解 三、數據庫核心操作 3.1 數據庫生命周期管理 3.2 數據庫存儲引擎選擇 四、數據表設計與操作 4.1 表結構創建(含數據類型詳解) …

Spring源碼解析 - SpringApplication run流程-prepareContext源碼分析

prepareContext源碼分析 private void prepareContext(DefaultBootstrapContext bootstrapContext, ConfigurableApplicationContext context,ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments, Bann…

HIS系統:醫院信息化建設的核心,采用Angular+Java技術棧,集成MySQL、Redis等技術,實現醫院全業務流程管理。

HIS系統在醫院信息化建設中扮演著核心的角色。它是一個綜合性的信息系統,旨在管理和運營醫院的各種業務,包括門診、住院、財務、物資、科研等。技術細節:前端:AngularNginx后臺:JavaSpring,SpringBoot&…

深度學習-卷積神經網絡-LeNet

卷積神經網絡是一種專門用于處理具有網格結構數據(如圖像、音頻等)的深度學習模型。它通過卷積層自動提取數據中的特征,利用局部連接和參數共享的特性減少了模型的參數數量,降低了過擬合的風險,同時能夠有效地捕捉數據…

【Java項目與數據庫、Maven的關系詳解】

Java項目與數據庫、Maven的關系詳解 一、Java項目是否都需要連接本地數據庫? 不一定,這取決于項目類型和需求: 1. 需要數據庫的項目類型項目類型數據庫作用典型場景Web應用存儲用戶數據/業務數據電商系統、CMS服務端程序持久化數據金融交易系…

兩個Maven工程,使用idea開發,工程A中依賴了工程B,改了工程B,工程A如何獲取最新代碼

兩個Maven工程,使用idea開發,工程A中依賴了工程B,改了工程B,工程A如何獲取最新代碼 如果工程B的版本是快照,那么如下。 步驟一 工程B 執行 clean package install deploy 步驟二 工程A 刷新Maven

奧比中光與地平線、地瓜機器人達成戰略合作,攜手推動機器人智能化

摘要:機器人“慧眼”與“智腦”強強聯合!8月11日,奧比中光與地平線及其控股子公司地瓜機器人在北京簽訂合作協議,雙方將在機器人智能化領域展開深度合作,充分發揮各自的技術與產品優勢,攜手推動機器人產業的…

【Linux】Tomcat

Tomcat簡介Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬于輕量級應用服務器,在中小型系統和 并發訪問用戶不是很多的場合下被普遍使用,Tomcat 具有處理HTML頁面的功能,它還是一個Servlet和 JSP容器Tomcat的使用安裝ja…

Putting it all together 將所有內容整合在一起

官方鏈接 https://www.youtube.com/watch?vAa_FAA3v22g&t1s Task1 Putting It All Together 將所有內容整合在一起 圖片版 文字版 Putting It All Together 將所有內容整合在一起 From the previous modules, youll have learned that quite a lot of things go on b…

Python 閉包詳解:從變量作用域到實戰案例

一、變量作用域基礎在 Python 中,變量根據作用范圍可分為三類:全局變量:定義在函數外部的變量,作用范圍是整個程序。如果在函數內部需要修改全局變量,必須使用global關鍵字聲明。局部變量:定義在函數內部的…

Docker 跨主機容器之間的通信macvlan

默認一個物理網卡,只有一個物理mac地址,虛擬多個mac地址 缺點:每次需要手動配置ip地址,容易ip地址沖突。類似于保存到execl表格里面。 兩臺物理機: docker-01和docker-02 創建macvlan網絡 [rootdocker-01 ~]# docker n…