欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring注解@Qualifier的使用&&與@Primary注解的不同

 更新時間:2023年10月17日 11:53:25   作者:Doker?多克?技術(shù)人的數(shù)碼品牌  
今天帶你了解一下Spring框架中的@Qualifier?注解,它解決了哪些問題,以及如何使用它,我們還將了解它與?@Primary?注解的不同之處,感興趣的朋友跟隨小編一起看看吧

1. 概述

今天帶你了解一下 Spring 框架中的 @Qualifier 注解,它解決了哪些問題,以及如何使用它。我們還將了解它與 @Primary 注解的不同之處。更多的技術(shù)解析請訪問 felord.cn

2. 痛點

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

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

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

3. @Qualifier

通過使用 @Qualifier 注解,我們可以消除需要注入哪個 bean 的問題。讓我們重新回顧一下前面的例子,看看我們?nèi)绾瓮ㄟ^包含 @Qualifier 注釋來指出我們想要使用哪個 bean 來解決問題:

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

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

     @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";
         }
     }

4. @Qualifier VS @Primary

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

    @Bean
    public Employee tomEmployee() {
        return new Employee("Tom");
    }
    @Bean
    @Primary
    public Employee johnEmployee() {
        return new Employee("john");
    }

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

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

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

5. 通過名稱來自動注入

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

    @Component
    public class FooService {
        @Autowired
        private Formatter fooFormatter;
        //todo 
    }

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

到此這篇關(guān)于Spring 注解 @Qualifier 詳解的文章就介紹到這了,更多相關(guān)Spring 注解 @Qualifier內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實現(xiàn)較大二進(jìn)制文件的讀、寫方法

    Java實現(xiàn)較大二進(jìn)制文件的讀、寫方法

    本篇文章主要介紹了Java實現(xiàn)較大二進(jìn)制文件的讀、寫方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Java中獲取泛型類型信息的方法

    Java中獲取泛型類型信息的方法

    本文主要介紹了Java中獲取泛型類型信息的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • JAVA遞歸生成樹形菜單的實現(xiàn)過程

    JAVA遞歸生成樹形菜單的實現(xiàn)過程

    這篇文章主要介紹了JAVA遞歸生成樹形菜單,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Redis之GEO存儲地理位置信息的使用

    Redis之GEO存儲地理位置信息的使用

    在外賣軟件中的附近的美食店鋪、外賣小哥的距離,打車軟件附近的車輛,交友軟件中附近的小姐姐。我們都可以利用redis的GEO地理位置計算得出。本文就來詳細(xì)的介紹一下
    2021-10-10
  • Spring計時器StopWatch的具體使用

    Spring計時器StopWatch的具體使用

    本文主要介紹了Spring計時器StopWatch的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • java編程實現(xiàn)獲取服務(wù)器IP地址及MAC地址的方法

    java編程實現(xiàn)獲取服務(wù)器IP地址及MAC地址的方法

    這篇文章主要介紹了java編程實現(xiàn)獲取機(jī)器IP地址及MAC地址的方法,實例分析了Java分別針對單網(wǎng)卡及多網(wǎng)卡的情況下獲取服務(wù)器IP地址與MAC地址的相關(guān)技巧,需要的朋友可以參考下
    2015-11-11
  • Java List 集合如何去除null元素

    Java List 集合如何去除null元素

    這篇文章主要介紹了Java List 集合如何去除null元素,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java 驗證用戶是否已經(jīng)登錄與實現(xiàn)自動登錄方法詳解

    java 驗證用戶是否已經(jīng)登錄與實現(xiàn)自動登錄方法詳解

    本文主要介紹了java 驗證用戶是否已經(jīng)登錄與實現(xiàn)自動登錄的方法。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • java 取模與取余的區(qū)別說明

    java 取模與取余的區(qū)別說明

    這篇文章主要介紹了java 取模與取余的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 使用@Validate分組驗證參數(shù)

    使用@Validate分組驗證參數(shù)

    SpringFramework的@Validated注解用于方法級別參數(shù)驗證,結(jié)合BeanValidation規(guī)范,支持分組驗證,通過指定驗證分組,可以在不同場景下執(zhí)行不同的驗證邏輯
    2024-11-11

最新評論