最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于@Qualifier("beanName")用法

 更新時(shí)間:2025年09月04日 09:51:03   作者:冰糖心書房  
@Qualifier用于精確指定Bean,@Primary設(shè)為默認(rèn),兩者共存時(shí),@Qualifier優(yōu)先級更高,可靈活選擇具體實(shí)現(xiàn),解決依賴注入歧義,兼顧簡潔與可配置性

@Qualifier("beanName")是什么?

@Qualifier 注解,正如其名(Qualifier 意為“限定符”、“修飾符”),它的核心作用是在依賴注入時(shí),提供更精確的篩選條件,幫助 Spring 從多個(gè)同類型的候選 Bean 中,準(zhǔn)確地“限定”出你想要的那一個(gè)。

@Primary 是在眾多選項(xiàng)中選出一個(gè)“默認(rèn)冠軍”,而 @Qualifier 則像是直接通過“身份證號”(Bean 的名字)來點(diǎn)名。

如何使用@Qualifier?

繼續(xù)我們之前的 NotificationService 例子。我們有兩個(gè) Bean:EmailNotificationServiceSmsNotificationService。

第一步:為 Bean 命名

Spring 默認(rèn)會給 Bean 一個(gè)名字,通常是類名首字母小寫(如 emailNotificationService)。但為了更清晰,我們最好自己指定一個(gè)簡短的名字。

這可以通過 @Service("beanName")@Component("beanName") 來實(shí)現(xiàn)。

import org.springframework.stereotype.Service;

@Service("emailNotifier") // 給這個(gè)Bean起一個(gè)限定名 "emailNotifier"
public class EmailNotificationService implements NotificationService {
    // ...
}
import org.springframework.stereotype.Service;

@Service("smsNotifier") // 給這個(gè)Bean起一個(gè)限定名 "smsNotifier"
public class SmsNotificationService implements NotificationService {
    // ...
}

現(xiàn)在,IoC 容器中有兩個(gè) NotificationService 類型的 Bean,它們分別被命名為 emailNotifiersmsNotifier。

第二步:在注入點(diǎn)使用 @Qualifier 進(jìn)行點(diǎn)名

現(xiàn)在,OrderService 可以明確地告訴 Spring 它想要哪一個(gè)實(shí)現(xiàn)。

  • 場景A:需要郵件通知
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class OrderService {
    private final NotificationService notificationService;

    @Autowired
    public OrderService(@Qualifier("emailNotifier") NotificationService notificationService) {
        // @Qualifier說:在所有NotificationService類型的Bean中,
        // 我就要那個(gè)名字叫 "emailNotifier" 的!
        this.notificationService = notificationService;
    }
    // ...
}
  • 場景B:另一個(gè)服務(wù),需要短信通知
@Service
public class UrgentOrderService {
    private final NotificationService notificationService;

    @Autowired
    public UrgentOrderService(@Qualifier("smsNotifier") NotificationService notificationService) {
        // 這里明確指定了需要短信通知服務(wù)
        this.notificationService = notificationService;
    }
    // ...
}

通過這種方式,@Qualifier 提供了極高的靈活性。

不同的消費(fèi)方可以根據(jù)自己的需求,注入同一個(gè)接口的不同實(shí)現(xiàn),而無需修改 Bean 定義方的代碼。

正面對決:@Primaryvs@Qualifier,誰的優(yōu)先級更高?

答案非常明確:@Qualifier 的優(yōu)先級更高。

可以這樣理解它們的邏輯關(guān)系:

Spring 的注入邏輯

1.首先按類型查找:找到所有類型為 NotificationService 的 Bean。

2.發(fā)現(xiàn)多個(gè)候選者emailNotificationServicesmsNotificationService

3.檢查是否有 @Qualifier 精確指定

  • 如果有(比如 @Qualifier("smsNotifier")),Spring 就會忽略其他所有因素(包括 @Primary),直接選擇名為 smsNotifier 的 Bean。@Qualifier 的指令是絕對的。
  • 如果沒有 @Qualifier,Spring 才會繼續(xù)下一步。

4.檢查是否有 @Primary 默認(rèn)選項(xiàng)

  • 在剩下的候選者中,尋找被 @Primary 標(biāo)記的 Bean。
  • 如果找到了,就注入那個(gè) @Primary 的 Bean。
  • 如果沒有找到 @Primary 的 Bean(也沒有 @Qualifier),Spring 就會再次陷入困惑,拋出 NoUniqueBeanDefinitionException

我們用一個(gè)比喻來描述

你去一家快餐店點(diǎn)漢堡。

  • @Primary:菜單上,“招牌牛肉漢堡”旁邊印著一個(gè)大大的 “本店推薦” 標(biāo)志。
  • @Qualifier:你對服務(wù)員說的話。

場景1:只使用 @Primary

  • 你對服務(wù)員說:“來個(gè)漢堡。”(相當(dāng)于 @Autowired NotificationService service;
  • 服務(wù)員看到菜單上的“本店推薦”,就直接給你拿了“招牌牛肉漢堡”。

場景2:@Primary@Qualifier 同時(shí)存在

  • 菜單上“招牌牛肉漢堡”依然是“本店推薦”(@Primary)。
  • 但你對服務(wù)員說:“我不要推薦的,給我來一個(gè)‘香辣雞腿堡’。”(相當(dāng)于 @Autowired @Qualifier("spicyChickenBurger") Burger burger;
  • 服務(wù)員會聽你的話,而不是看菜單的推薦。你的直接指令(@Qualifier)優(yōu)先級更高。

代碼示例驗(yàn)證優(yōu)先級

@Service("emailNotifier")
@Primary // Email服務(wù)是首選
public class EmailNotificationService implements NotificationService { ... }

@Service("smsNotifier")
public class SmsNotificationService implements NotificationService { ... }

// --- 消費(fèi)者 ---
@Service
public class OrderService {
    private final NotificationService notificationService;

    @Autowired
    public OrderService(@Qualifier("smsNotifier") NotificationService notificationService) {
        // 盡管Email是@Primary,但這里通過@Qualifier明確指定了smsNotifier
        this.notificationService = notificationService;
    }

    public void placeOrder() {
        // 這將調(diào)用 SmsNotificationService
        notificationService.sendNotification("您的訂單已成功創(chuàng)建!");
    }
}

在這個(gè)例子中,最終被注入到 OrderService 的是 SmsNotificationService,完美驗(yàn)證了 @Qualifier 的更高優(yōu)先級。

總結(jié)

特性@Primary@Qualifier("beanName")
角色設(shè)置全局默認(rèn)值進(jìn)行局部精確指定
決定權(quán)Bean 的提供方Bean 的消費(fèi)方
優(yōu)先級較低較高
使用時(shí)機(jī)當(dāng)多個(gè)實(shí)現(xiàn)中有一個(gè)是絕大多數(shù)情況下的選擇時(shí)。當(dāng)需要靈活地在多個(gè)實(shí)現(xiàn)之間切換,或者需要覆蓋 @Primary 的默認(rèn)行為時(shí)。

@Primary@Qualifier 是 Spring IoC 中一對相輔相成的利器,共同解決了依賴注入中的歧義性問題,使得代碼既能保持簡潔(依賴于默認(rèn)),又能擁有足夠的靈活性(按需指定)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java的JSON格式轉(zhuǎn)換庫GSON的初步使用筆記

    Java的JSON格式轉(zhuǎn)換庫GSON的初步使用筆記

    GSON是Google開發(fā)并在在GitHub上開源的Java對象與JSON互轉(zhuǎn)功能類庫,在Android開發(fā)者中也大受歡迎,這里我們就來看一下Java的JSON格式轉(zhuǎn)換庫GSON的初步使用筆記:
    2016-06-06
  • java將圖片至暗的實(shí)現(xiàn)方法

    java將圖片至暗的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava將圖片至暗的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • idea2020.1最新版永久破解/pycharm也可用(步驟詳解)

    idea2020.1最新版永久破解/pycharm也可用(步驟詳解)

    這篇文章主要介紹了idea2020.1最新版永久破解/pycharm也可用,本文給大家分享簡單實(shí)現(xiàn)步驟,通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java讀取String分行字符串的方法

    Java讀取String分行字符串的方法

    今天小編就為大家分享一篇Java讀取String分行字符串的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • java事件處理模型知識點(diǎn)總結(jié)

    java事件處理模型知識點(diǎn)總結(jié)

    在本篇文章里小辮給大家分享的是一篇關(guān)于java事件處理模型知識點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • 詳解springMVC獲取前端請求的數(shù)據(jù)與三個(gè)作用域

    詳解springMVC獲取前端請求的數(shù)據(jù)與三個(gè)作用域

    文章介紹了Spring MVC中獲取前端請求數(shù)據(jù)的多種方式,包括使用@RequestParam注解、@RequestHeader注解和@CookieValue注解,以及處理請求中文亂碼的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • java實(shí)現(xiàn)傾斜水印鋪滿整張圖

    java實(shí)現(xiàn)傾斜水印鋪滿整張圖

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)傾斜水印鋪滿整張圖的具體代碼,教大家如何控制水印之間的空隙,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Spring Boot 文件上傳原理解析

    Spring Boot 文件上傳原理解析

    Spring Boot 文件上傳原理其實(shí)就是Spring MVC,因?yàn)檫@部分工作是Spring MVC做的而不是Spring Boot,那么,SpringMVC又是怎么處理文件上傳這個(gè)過程的呢?下面通過本文給大家詳細(xì)介紹下,一起看看吧
    2018-03-03
  • Java?定時(shí)任務(wù)技術(shù)趨勢詳情

    Java?定時(shí)任務(wù)技術(shù)趨勢詳情

    這篇文章主要介紹了Java?定時(shí)任務(wù)技術(shù)趨勢詳情,定時(shí)任務(wù)是每個(gè)業(yè)務(wù)常見的需求,比如每分鐘掃描超時(shí)支付的訂單,每小時(shí)清理一次數(shù)據(jù)庫歷史數(shù)據(jù),每天統(tǒng)計(jì)前一天的數(shù)據(jù)并生成報(bào)表等,下文更多相關(guān)資料,需要的小伙伴可以參考一下
    2022-05-05
  • Java page cache回寫機(jī)制案例詳解

    Java page cache回寫機(jī)制案例詳解

    這篇文章主要介紹了Java page cache回寫機(jī)制案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論

鄂州市| 平遥县| 渭南市| 胶南市| 闽侯县| 慈利县| 岳西县| 贵德县| 平泉县| 安福县| 呼玛县| 武宁县| 东方市| 云阳县| 甘谷县| 葵青区| 太谷县| 独山县| 九龙坡区| 侯马市| 安新县| 兰州市| 鄂尔多斯市| 安塞县| 阜南县| 新民市| 三原县| 大姚县| 富源县| 阿拉善盟| 天长市| 白朗县| 通化县| 彭山县| 日照市| 奉贤区| 子洲县| 绥滨县| 米泉市| 湘潭县| 安平县|