Spring注解@Qualifier

@Autowired 注解是 Spring 依賴注入。但是有些場景下僅僅靠這個注解不足以讓Spring知道到底要注入哪個 bean
默認情況下,@Autowired 按類型裝配 Spring Bean
如果容器中有多個相同類型的 bean,則框架將拋出 NoUniqueBeanDefinitionException, 以提示有多個滿足條件的 bean 進行自動裝配。程序無法正確做出判斷使用哪一個,下面例子:

    @Component("fooFormatter")public class FooFormatter implements Formatter {public String format() {return "foo";}}@Component("barFormatter")public class BarFormatter implements Formatter {public String format() {return "bar";}}@Componentpublic class FooService {@Autowiredprivate Formatter formatter;//todo }

如果我們嘗試將 FooService 加載到我們的上下文中,Spring 框架將拋出 NoUniqueBeanDefinitionException。這是因為 Spring 不知道要注入哪個 bean。為了避免這個問題,有幾種解決方案。那么我們本文要講解的 @Qualifier 注解就是其中之一。跟著小胖哥的節奏往下走。

1. @Qualifier

使用 @Qualifier 注解,可以消除需要注入哪個 bean 的問題。前面的例子如何通過包含 @Qualifier 注釋想要使用哪個 bean 來解決問題:

    @Componentpublic class FooService {@Autowired@Qualifier("fooFormatter")private Formatter formatter;//todo }

通過將 @Qualifier 注解與我們想要使用的特定 Spring bean 的名稱一起進行裝配,Spring 框架就能從多個相同類型并滿足裝配要求的 bean 中找到我們想要的,避免讓Spring腦裂。我們需要做的是@Component或者@Bean注解中聲明的value屬性以確定名稱。
其實我們也可以在 Formatter 實現類上使用 @Qualifier 注釋,而不是在 @Component 或者 @Bean 中指定名稱,也能達到相同的效果:

     @Component@Qualifier("fooFormatter")public class FooFormatter implements Formatter {public String format() {return "foo";}}@Component@Qualifier("barFormatter")public class BarFormatter implements Formatter {public String format() {return "bar";}}

2. @Qualifier VS @Primary

還有另一個名為 @Primary 的注解,我們也可以用來發生依賴注入的歧義時決定要注入哪個 bean。當存在多個相同類型的 bean 時,此注解定義了首選項。除非另有說明,否則將使用與 @Primary 注釋關聯的 bean
我們來看一個例子:

    @Beanpublic Employee tomEmployee() {return new Employee("Tom");}@Bean@Primarypublic Employee johnEmployee() {return new Employee("john");}

在此示例中,兩個方法都返回相同的 Employee類型。Spring 將注入的 bean 是方法 johnEmployee 返回的 bean。這是因為它包含 @Primary 注解。當我們想要指定默認情況下應該注入特定類型的 bean 時,此注解很有用。
如果我們在某個注入點需要另一個 bean,我們需要專門指出它。我們可以通過 @Qualifier 注解來做到這一點。例如,我們可以通過使用 @Qualifier 注釋來指定我們想要使用 tomEmployee 方法返回的 bean
值得注意的是,如果 @Qualifier@Primary 注釋都存在,那么 @Qualifier 注釋將具有優先權。基本上,@Primary 是定義了默認值,而 @Qualifier 則非常具體。
當然@Component 也可以使用@Primary 注解,這次使用的還是上面3的示例:

     @Component@Primarypublic class FooFormatter implements Formatter {public String format() {return "foo";}}@Componentpublic class BarFormatter implements Formatter {public String format() {return "bar";}}

在這種情況下,@Primary 注解指定了默認注入的是 FooFormatter,消除了場景中的注入歧義。

3. 通過名稱來自動注入

在使用 @Autowired 進行自動裝配時,如果 Spring 沒有其他提示,將會按照需要注入的變量名稱來尋找合適的 bean。也可以解決依賴注入歧義的問題。讓我們看一些基于我們最初的例子的代碼:

    @Componentpublic class FooService {@Autowiredprivate Formatter fooFormatter;//todo }

在這種情況下,Spring 將確定要注入的 beanFooFormatter,因為字段名稱與我們在該 bean@Component或者 @Bean 注解中使用的值(默認 @Bean 使用方法名)相匹配。

4. 總結

通過對 @Qualifier 的探討,我們知道該注解是用來消除依賴注入沖突的。這種在日常開發,比如 Rabbtimq 的隊列聲明中很常見。小胖哥也通過該注解和其他上述注解的組合使用和對比中展示了一些常用的用法。這將有助于你對 Spring 的依賴注入機制的了解。

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

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

相關文章

數字化產科管理平臺全套源碼,java產科電子病歷系統源碼

數字化產科管理平臺全套成品源碼,產科電子病歷系統源碼,多家大型婦幼專科醫院應用案例。源碼完全授權交付。 數字化產科管理平臺(智慧產科系統)是為醫院產科量身定制的信息管理系統。它管理了孕婦從懷孕開始到生產結束42天以內的一…

數據庫MySQL學習筆記

數據庫MySQL學習筆記 主要記錄常見的MySQL語句學習過程,增刪改查。 -- 顯示所有數據庫 SHOW DATABASES;-- 創建新數據庫 CREATE DATABASE mydatabase;-- 使用數據庫 USE mydatabase;-- 顯示當前數據庫中的所有表 SHOW TABLES;-- 創建新表 CREATE TABLE users (id …

BERT--學習

一、Transformer Transformer,是由編碼塊和解碼塊兩部分組成,其中編碼塊由多個編碼器組成,解碼塊同樣也是由多個解碼塊組成。 編碼器:自注意力 全連接 多頭自注意力:Q、K、V 公式: 解碼塊&#xff1…

【Hive實戰】 HiveMetaStore的指標分析

HiveMetaStore的指標分析(一) 文章目錄 HiveMetaStore的指標分析(一)背景目標部署架構 hive-site.xml相關配置元數據服務的指標相關配置 源碼部分(hive2.3系)JvmPauseMonitor.javaHiveMetaStore的內部類HMS…

【anaconda】—“conda info“命令后conda配置和環境信息的理解

文章目錄 conda配置和環境信息的理解 conda配置和環境信息的理解 安裝anaconda成功后,打開cmd,輸入"conda info"命令,結果顯示如下: conda的配置和環境信息的輸出。以下是對每個字段的解釋: active environm…

H2 Database Console未授權訪問漏洞封堵

背景 H2 Database Console未授權訪問,默認情況下自動創建不存在的數據庫,從而導致未授權訪問。各種未授權訪問的教程,但是它怎么封堵呢? -ifExists 很簡單,啟動參數添加 -ifExists ,它的含義&#xff1a…

中電金信:加快企業 AI 平臺升級,構建金融智能業務新引擎

在當今數字化時代的浪潮下,人工智能(AI)技術的蓬勃發展正為各行業帶來前所未有的變革與創新契機。尤其是在金融領域,AI 模型的廣泛應用已然成為提升競爭力、優化業務流程以及實現智能化轉型的關鍵驅動力。然而,企業在積…

【C++ 】解決 C++ 語言報錯:Null Pointer Dereferenc

文章目錄 引言 在 C 編程中,空指針解引用(Null Pointer Dereference)是一種常見且危險的錯誤。當程序試圖通過空指針訪問內存時,會導致程序崩潰或產生不可預期的行為。本文將詳細探討空指針解引用的成因、檢測方法及其預防和解決…

微信新寵!淘寶扭蛋機小程序,讓購物更添樂趣

在移動互聯網飛速發展的今天,微信小程序以其便捷性、即用即走的特點,迅速成為了用戶日常生活中不可或缺的一部分。而在眾多小程序中,一款名為“淘寶扭蛋機”的新晉“網紅”,正以其獨特的玩法和豐富的驚喜,為購物體驗增…

【Hive實戰】HiveMetaStore的指標采集告警

HiveMetaStore的指標采集告警 文章目錄 HiveMetaStore的指標采集告警背景部署概要圖 開啟HiveMetaStore的JMX指標采集(Hadoop2指標系統)指標監控查詢指標核心指標選擇告警 遺留問題 背景 在遠程模式的Metastore下,對其開啟Hadoop2指標采集以…

簡單配置VScode輕量級C++競賽環境

1. 安裝拓展 Chinese是中文,需要重啟才可以運行,C/C拓展只是進行語法代碼提示,不需要進行任何配置修改,默認即可。 2. 創建文件 如上圖創建好各級文件夾,其中C是工作文件夾,.vscode是配置文件夾&#xff0…

【網絡安全】Host碰撞漏洞原理+工具+腳本

文章目錄 漏洞原理虛擬主機配置Host頭部字段Host碰撞漏洞漏洞場景工具漏洞原理 Host 碰撞漏洞,也稱為主機名沖突漏洞,是一種網絡攻擊手段。常見危害有:繞過訪問控制,通過公網訪問一些未經授權的資源等。 虛擬主機配置 在Web服務器(如Nginx或Apache)上,多個網站可以共…

學習測試2-方法

設計測試用例 設計測試用例的萬能公式 (在沒有需求文檔的情況下) 軟件質量模型 效率就是性能 兼容性測試 瀏覽器 谷歌 IE 火狐 蘋果 百度 Windows7 10 11 蘋果系統 app 不同品牌 小米 vivo 華為 蘋果 不同的操作系統 安卓 鴻蒙 蘋果 -----------------------…

TikTok馬來西亞直播網絡怎么配置?

TikTok是一款全球流行的社交媒體應用,在東南亞地區擁有大量用戶。在馬來西亞這個多元化的國家,配置高效穩定的直播網絡對TikTok的運營至關重要。 配置馬來西亞直播網絡的必要性 廣泛的地理覆蓋:馬來西亞包括大片陸地和眾多島嶼,網…

OpenSSH遠程代碼執行漏洞(CVE-2024-6387)

OpenSSH遠程代碼執行漏洞(CVE-2024-6387) 漏洞簡介及影響范圍 OpenSSH 遠程代碼執行漏洞(CVE-2024-6387)是影響 OpenSSH 服務器的一個高危安全漏洞,允許未經身份驗證的遠程攻擊者在受影響的 Linux 系統上以 root 身份執行任意代碼。這個嚴重…

性能壓測 -優化 Nginx的動靜分離

兩件事情 1.以后將所有的項目的靜態資源都應該放在nginx里面 2.nginx 規則:/static/***所有請求都有nginx直接返回 nginx 配置一下配置文件,然后把html 的靜態資源,綁定好是Nginx優先級高的靜態資源路徑,就去交給nginx靜態資源…

使用openssl生成公私鑰并進行RSA加密

生成私鑰 openssl genrsa -out private.pem 1024通過私鑰生成公鑰 openssl rsa -in private.pem -pubout -out public.pem通過公鑰加密數據 openssl pkeyutl -encrypt -in data.txt -inkey public.pem -pubin -out encData.txtdata.txt :為我們要加密的數據enc…

skimage.io與matplotlib.image.imread讀取圖片的區別

以前沒用過matplotlib的讀圖方式,今天在別人的工程里看到這個用法,自己改寫別人工程時,怎么都找不到問題,最后在最初,開始讀圖的時候發現了問題。 目錄 🌷🌷1.對于png格式的3波段uint8圖像 &a…

Prometheus + Grafana 監控系統搭建使用指南-Nacos 接入 Prometheus 監控

Nacos 接入 Prometheus 監控 系列文章目錄 Prometheus 的安裝部署Grafana的安裝部署Linux服務器接入Prometheus監控-Node Exporter 安裝指南Prometheus 接入SpringBoot微服務監控Mysql 接入 Prometheus RocketMQ 接入Prometheus 監控ElasticSearch 接入 PrometheusNacos 接入…

在Android運行時切換Retrofit Base URL:簡化開發環境與生產環境的切換

在運行時切換Retrofit Base URL:簡化開發環境與生產環境的切換 在Android開發中,Retrofit是一個由Square開發的類型安全的HTTP客戶端庫。它為API認證和網絡請求提供了一個強大的框架。然而,在開發過程中,我們常常需要在不同的環境(如開發環境和生產環境)之間切換Base UR…