使用@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 ...