為什么在Spring中使用@Autowired時會提示Field injection is not recommended 而@Resource不會

在使用IDEA進行開發時,在字段上使用Spring的依賴注入注解@Autowired后會出現如下警告

Field injection is not recommended (字段注入是不被推薦的)?

?這個原因具體可以看看:

【注解使用】使用@Autowired后提示:Field injection is not recommended(Spring團隊不推薦使用Field注入)

?【Spring】淺談spring為什么推薦使用構造器注入

我們這里討論:

使用@Resource卻不會出現此提示

網上文章大部分都是介紹兩者的區別,沒有提到為什么


Spring常見的DI方式

  • 構造器注入?:利用構造方法的參數注入依賴

  • Setter注入?:調用Setter的方法注入依賴

  • 字段注入?:在字段上使用@Autowired/Resource注解


@Resource注解也可以完成屬性注入。那它和@Autowired注解有什么區別?

  • @Resource注解是JDK擴展包中的,也就是說屬于JDK的一部分。所以該注解是標準注解,更加具有通用性。(JSR-250標準中制定的注解類型。JSR是Java規范提案。)

  • @Autowired注解是Spring框架自己的。

  • @Resource注解默認根據名稱裝配byName,未指定name時,使用屬性名作為name。通過name找不到的話會自動啟動通過類型byType裝配。

  • @Autowired注解默認根據類型裝配byType,如果想根據名稱裝配,需要配合@Qualifier注解一起用。

  • @Resource注解用在屬性上、setter方法上。

  • @Autowired注解用在屬性上、setter方法上、構造方法上、構造方法參數上。


各種DI方式的優缺點

參考Spring官方文檔,建議了如下的使用場景:

  • 構造器注入?:強依賴性?(即必須使用此依賴),不變性?(各依賴不會經常變動)

  • Setter注入?:可選?(沒有此依賴也可以工作),可變?(依賴會經常變動)

  • Field注入?:大多數情況下盡量少使用?字段注入,一定要使用的話,?@Resource相對@Autowired?對IoC容器的耦合更低


?

Field注入的缺點

  • 不能像構造器那樣注入不可變的對象

  • 依賴對外部不可見?,外界可以看到構造器和setter,但無法看到私有字段,自然無法了解所需依賴

  • 會導致組件與IoC容器緊耦合?(這是最重要的原因,離開了IoC容器去使用組件,在注入依賴時就會十分困難)

  • 導致單元測試也必須使用IoC容器?,原因同上

  • 依賴過多時不夠明顯?,比如我需要10個依賴,用構造器注入就會顯得龐大,這時候應該考慮一下此組件是不是違反了單一職責原則


為什么IDEA只對@Autowired警告

Field注入雖然有很多缺點,但它的好處也不可忽略:那就是太方便了?。使用構造器或者setter注入需要寫更多業務無關的代碼,十分麻煩,而字段注入大幅簡化了它們。并且絕大多數情況下業務代碼和框架就是強綁定的,完全松耦合只是一件理想上的事,犧牲了敏捷度去過度追求松耦合反而得不償失。

那么問題來了,為什么IDEA只對@Autowired警告,卻對@Resource視而不見呢?

1、@Autowired?是Spring?提供的,它是特定IoC提供的特定注解?,這就導致了應用與框架的強綁定?,一旦換用了其他的IoC框架,是不能夠支持注入?的。

而?@Resource?是JSR-250?提供的,它是Java標準?,我們使用的IoC容器應當去兼容它,這樣即使更換容器,也可以正常工作。


2、@Autowired和 @Resource的默認注入方式不同,@Autowired默認是根據類型進行注入的, @Resource默認是先根據名字注入,找不到再根據類型注入的。所以,相比于 @Autowired 注解,@Resource 注解更加靈活,但同時也更難以確保依賴項的正確性。如果無法確定自動注入的 Bean 是否正確,可以通過 @Qualifier 注解或者手動注入的方式顯式指定 Bean 的名稱或類型,避免依賴項注入的錯誤和困擾。

參考文章:

為什么在Spring中使用@Autowired時會報錯 而@Resource不會

為什么 Spring和IDEA 都不推薦使用 @Autowired 注解

?

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

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

相關文章

【抖音小玩法-彈幕游戲】開發者功能測試報告提交模板

背景 字節有明確的要求,準入和準出更加嚴格,要求有明確的測試報告。格式如下: *本文參考字節wiki:開發者功能測試報告提交模板 網絡兼容性 請確認在以下網絡類型驗證過插件功能 WIFI 4G 測試機型 請羅列驗證過的雙端機型 An…

python+django+mysql高校校園外賣點餐系統--計算機畢設項目

本文的研究目標是以高校校園外賣點餐為對象,使其高校校園外賣點餐為目標,使得高校校園外賣點餐的信息化體系發展水平提高。論文的研究內容包括對個人中心、美食分類管理、用戶管理、商家管理、美食信息管理、工作人員管理、安全檢查管理、系統管理、訂單…

時序預測 | MATLAB實現基于GRU門控循環單元的時間序列預測-遞歸預測未來(多指標評價)

時序預測 | MATLAB實現基于GRU門控循環單元的時間序列預測-遞歸預測未來(多指標評價) 目錄 時序預測 | MATLAB實現基于GRU門控循環單元的時間序列預測-遞歸預測未來(多指標評價)預測結果基本介紹程序設計參考資料 預測結果 基本介紹 1.Matlab實現GRU門控循環單元時間序列預測未…

復數混頻器、零中頻架構和高級算法開發

文章里講解了關于射頻IQ調制器、零中頻架構相關的原理及技術,全都是干貨!其實好多同行對軟件無線電的原理、IQ調制、鏡像抑制都是一知半解,知其然不知其所以然。好好研讀這篇文章,相信會讓你有種恍然大悟的感覺。 RF工程常被視為…

Shell學習筆記之基礎部分

Shell基礎: 查看操作系統支持的shell: [rootrhel9 ansible]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bashShell的基本元素: 聲明:聲明用哪個命令解釋器來解釋并執行當前腳本文件中的語句,一般寫的…

大語言模型與語義搜索;釘釘個人版啟動內測,提供多項AI服務

🦉 AI新聞 🚀 釘釘個人版啟動內測,提供多項AI服務 摘要:釘釘個人版正式開始內測,面向小團隊、個人用戶、高校大學生等人群。該版本具有AI為核心的功能,包括文生文AI、文生圖AI和角色化對話等。用戶可通過…

【IEEE會議】第二屆IEEE云計算、大數據應用與軟件工程國際學術會議 (CBASE2023)

第二屆IEEE云計算、大數據應用與軟件工程國際學術會議 (CBASE2023) 隨著大數據時代的到來,對數據獲取的隨時性和對計算的需求也在逐漸增長。為推動大數據時代的云計算與軟件工程的發展,促進該領域學術交流,在CBASE 2022成功舉辦的…

設計模式——經典單例

0、核心要素 // 構造、析構函數私有化(一個進程只允許一個對象存在) // 對象私有化、靜態化(因為接口靜態函數) // 對象調用接口靜態化(因為靜態函數脫離了類對象,可以直接調用) 一、懶漢 唯…

如何更好的維護自己的電腦?

我的筆記本電腦 我使用的華碩天選3是一款游戲本,搭載了英特爾酷睿i7-12700H處理器,16GB內存,512GB固態硬盤和NVIDIA GeForce RTX 3050顯卡。屏幕尺寸為15.6英寸,分辨率為2560x1440。對于日常使用和工作學習娛樂都能滿足要求。 日常…

基于docker搭建pytest自動化測試環境(docker+pytest+jenkins+allure)

pytest搭建自動化測試環境(dockerpytestjenkinsallure) 這里我以ubuntu18為例 如果有docker環境,可以直接拉取我打包好的鏡像docker pull ziyigun/jenkins:v1.0 1 搭建Docker 1.1 安裝docker # 配置docker安裝環境 sudo apt-get install ap…

潤和軟件HopeStage操作系統正式上架阿里云、華為云、騰訊云商店

近日,潤和軟件HopeStage操作系統正式上架阿里云、華為云、騰訊云商店。 隨著科技的發展,云服務成為現代社會信息和資訊的交換、共享、存儲、檢索、應用等重要方式。阿里云、華為云、騰訊云作為我國云服務市場三巨頭,其云商店產品全面覆蓋云、…

Nvidia Jetson 編解碼開發(1)介紹

前言 由于項目需要,需要開發Jetson平臺的硬件編解碼; 優化CPU帶寬,后續主要以介紹硬件編解碼為主 1.Jetson各平臺編解碼性能說明 如下是拿了Jetson nano/tx2/Xavier等幾個平臺做對比; 這里說明的編解碼性能主要是對硬件來說的 2. 編解碼實現說明 2.1 軟件編解碼 優點:…

Idea中隱藏指定文件或指定類型文件

Setting ->Editor ->Code Style->File Types → Ignored Files and Folders輸入要隱藏的文件名,支持*號通配符回車確認添加

Windows權限維持—自啟動映像劫持粘滯鍵輔助屏保后門WinLogon

Windows權限維持—自啟動&映像劫持&粘滯鍵&輔助屏保后門&WinLogon 1. 前置2. 自啟動2.1. 路徑加載2.1.1. 放置文件2.1.2. 重啟主機 2.2. 服務加載2.2.1. 創建服務2.2.2. 查看服務2.2.3. 重啟主機 2.3. 注冊表加載2.3.1. 添加啟動項2.3.2. 查看注冊表2.3.3. 重啟…

YOLOv5基礎知識入門(7)— NMS(非極大值抑制)原理解析

前言:Hello大家好,我是小哥談。NMS是指非極大值抑制(non maximum suppression),它是一種常用于物體檢測任務的算法。在物體檢測中,通常會有多個預測框(bounding box)被提議出來&…

機器學習深度學習——transformer(機器翻譯的再實現)

👨?🎓作者簡介:一位即將上大四,正專攻機器學習的保研er 🌌上期文章:機器學習&&深度學習——自注意力和位置編碼(數學推導代碼實現) 📚訂閱專欄:機器…

【論文閱讀】 Model Sparsity Can Simplify Machine Unlearning

Model Sparsity Can Simplify Machine Unlearning 背景主要內容Contribution Ⅰ:對Machine Unlearning的一個全面的理解Contribution Ⅱ:說明model sparsity對Machine Unlearning的好處Pruning方法的選擇sparse-aware的unlearning framework Experiments…

JetBrains IDE遠程開發功能可供GitHub用戶使用

JetBrains與GitHub去年已達成合作,提供GitHub Codespaces 與 JetBrains Gateway 之間的集成。 GitHub Codespaces允許用戶創建安全、可配置、專屬的云端開發環境,此集成意味著您可以通過JetBrains Gateway使用在 GitHub Codespaces 中運行喜歡的IDE進行…

VScode搭建Opencv(C++開發環境)

VScode配置Opencv 一、 軟件版本二 、下載軟件2.1 MinGw下載2.2 Cmake下載2.3 Opencv下載 三、編譯3.1 cmake-gui3.2 make3.3 install 四、 VScode配置4.1 launch.json4.2 c_cpp_properties.json4.3 tasks.json 五、測試 一、 軟件版本 cmake :cmake-3.27.2-windows-x86_64 Mi…

JAVA基礎知識(一)——Java語言描述、變量和運算符

TOC(Java語言描述、變量和運算符) 一、JAVA語言描述 1.1 java語言描述 JDK、JRE、jVM三者之間的關系,以及JDK、JRE包含的主要結構有哪些? JDKJre java的開發工具(javac.exe java.exe javadoc.exe) jre jvmjava的核心類庫 為什…