Spring 註解 Qualifier 詳細解析

2021-10-01 22:49:27 字數 3053 閱讀 7144

spring 註解 @qualifier 詳細解析)

今天帶你了解一下 spring 框架中的 @qualifier 註解,它解決了哪些問題,以及如何使用它。我們還將了解它與 @primary 註解的不同之處。

使用 @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 將確定要注入的 bean 是 fooformatter,因為欄位名稱與我們在該 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 ...