Spring 註解 Qualifier 詳細解析

2022-01-10 18:56:42 字數 3891 閱讀 8751

使用@autowired註解是spring依賴注入的絕好方法。但是有些場景下僅僅靠這個註解不足以讓spring知道到底要注入哪個bean

預設情況下,@autowired按型別裝配spring bean

如果容器中有多個相同型別的bean,則框架將丟擲nouniquebeandefinitionexception, 以提示有多個滿足條件的bean進行自動裝配。程式無法正確做出判斷使用哪乙個,下面就是個鮮活的例子:

@component

("fooformatter"

)public

class

fooformatter

implements

formatter

}@component

("barformatter"

)public

class

barformatter

implements

formatter

}@component

public

class

fooservice

如果我們嘗試將fooservice載入到我們的上下文中,spring框架將丟擲nouniquebeandefinitionexception。這是因為spring不知道要注入哪個bean。為了避免這個問題,有幾種解決方案。那麼我們本文要講解的@qualifier註解就是其中之一。跟著小胖哥的節奏往下走。

通過使用@qualifier註解,我們可以消除需要注入哪個bean的問題。讓我們重新回顧一下前面的例子,看看我們如何通過包含@qualifier注釋來指出我們想要使用哪個bean來解決問題:

@component

public

class

fooservice

通過將@qualifier註解與我們想要使用的特定spring bean的名稱一起進行裝配,spring框架就能從多個相同型別並滿足裝配要求的bean中找到我們想要的,避免讓spring腦裂。我們需要做的是@component或者@bean註解中宣告的value屬性以確定名稱。

其實我們也可以在formatter實現類上使用@qualifier注釋,而不是在@component或者@bean中指定名稱,也能達到相同的效果:

@component

@qualifier

("fooformatter"

)public

class

fooformatter

implements

formatter

}@component

@qualifier

("barformatter"

)public

class

barformatter

implements

formatter

}

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

我們來看乙個例子:

@bean

public employee tomemployee()

@bean

@primary

public employee johnemployee()

在此示例中,兩個方法都返回相同的employee型別。spring將注入的bean是方法johnemployee返回的bean。這是因為它包含@primary註解。當我們想要指定預設情況下應該注入特定型別的bean時,此註解很有用。

如果我們在某個注入點需要另乙個bean,我們需要專門指出它。我們可以通過@qualifier註解來做到這一點。例如,我們可以通過使用@qualifier注釋來指定我們想要使用tomemployee方法返回的bean

值得注意的是,如果@qualifier@primary注釋都存在,那麼@qualifier注釋將具有優先權。基本上,@primary是定義了預設值,而@qualifier則非常具體。

當然@component也可以使用@primary註解,這次使用的還是上面3的示例:

@component

@primary

public

class

fooformatter

implements

formatter

}@component

public

class

barformatter

implements

formatter

}

在這種情況下,@primary註解指定了預設注入的是fooformatter,消除了場景中的注入歧義。

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

@component

public

class

fooservice

在這種情況下,spring將確定要注入的beanfooformatter,因為欄位名稱與我們在該bean@component或者@bean註解中使用的值(預設@bean使用方法名)相匹配。

通過對@qualifier的**,我們知道該註解是用來消除依賴注入衝突的。這種在日常開發,比如rabbtimq的佇列宣告中很常見。小胖哥也通過該註解和其他上述註解的組合使用和對比中展示了一些常用的用法。這將有助於你對spring的依賴注入機制的了解。

個人部落格:

Spring註解 Import註解

常用的匯入註解分類 註冊自己寫的類service dao controller可用包掃瞄 元件標註註解 controller service repository component bean 匯入的第三方包裡面的元件 import 快速給容器中匯入乙個元件 1 import 要匯入到容器中的元件 ...

spring註解之 Scope註解

1,scope註解是什麼 scope註解是springioc容器中的乙個作用域,在 spring ioc 容器中具有以下幾種作用域 基本作用域singleton 單例 prototype 多例 web 作用域 reqeust session globalsession 自定義作用域 a.single...

spring註解之 value註解

首先在xml中定義乙個bean如下 把對應的引數以property中value的形式注入 測試 如下 根據bean id獲取bean物件 system.out.println bean 執行結果如下 可以發現已經獲取到xml中配置的屬性了 user username zhangsan,age 26 ...