Spring中@Primary注解的作用與使用
在 Spring 框架中,@Primary
注解用于解決依賴注入時的歧義性(Ambiguity)問題。當(dāng) Spring 容器中存在多個相同類型的 Bean 時,通過 @Primary
標(biāo)記其中一個 Bean 作為默認(rèn)的首選注入對象。
核心作用:
解決多個同類型 Bean 的沖突當(dāng)有多個實(shí)現(xiàn)同一接口或相同類型的 Bean 時,Spring 無法自動確定注入哪個 Bean,會拋出
NoUniqueBeanDefinitionException
。使用@Primary
可指定默認(rèn)注入的 Bean。隱式選擇優(yōu)先級被標(biāo)記為
@Primary
的 Bean 會被優(yōu)先注入,無需額外使用@Qualifier
指定名稱。
使用示例:
場景定義
假設(shè)有一個支付接口 PaymentService
和兩個實(shí)現(xiàn)類:
public interface PaymentService { void pay(); } @Component public class CreditCardService implements PaymentService { @Override public void pay() { System.out.println("信用卡支付"); } } @Component public class AlipayService implements PaymentService { @Override public void pay() { System.out.println("支付寶支付"); } }
問題:依賴注入歧義
若直接注入 PaymentService
,Spring 會報錯:
@Autowired private PaymentService paymentService; // 拋出 NoUniqueBeanDefinitionException
解決方案:使用 @Primary
標(biāo)記其中一個實(shí)現(xiàn)類為默認(rèn)首選:
@Component @Primary // 指定為默認(rèn)注入的 Bean public class AlipayService implements PaymentService { ... }
此時注入會成功選擇 AlipayService
:
@Autowired private PaymentService paymentService; // 隱式注入 AlipayService
與其他注解的優(yōu)先級:
@Primary
vs@Qualifier
@Qualifier
顯式指定 Bean 名稱的優(yōu)先級高于@Primary
。- 例如:
@Autowired @Qualifier("creditCardService")
會覆蓋@Primary
。
多個
@Primary
的沖突如果多個同類型 Bean 都被標(biāo)記為@Primary
,Spring 會再次拋出歧義異常。
常見使用場景:
- 數(shù)據(jù)庫多數(shù)據(jù)源配置在多個
DataSource
Bean 中,標(biāo)記默認(rèn)使用的數(shù)據(jù)源。 - 不同環(huán)境下的實(shí)現(xiàn)類例如在測試和生產(chǎn)環(huán)境中提供同一接口的不同實(shí)現(xiàn),通過
@Primary
切換默認(rèn)實(shí)現(xiàn)。 - 第三方庫的擴(kuò)展當(dāng)覆蓋第三方庫提供的 Bean 時,將自己的實(shí)現(xiàn)標(biāo)記為
@Primary
。
配置方式:
除了注解在類上,也可以在 @Bean
方法中使用:
@Configuration public class AppConfig { @Bean @Primary // 標(biāo)記此 Bean 為首選 public PaymentService alipayService() { return new AlipayService(); } }
總結(jié):
場景 | 解決方案 |
---|---|
多個同類型 Bean,需默認(rèn)注入一個 | 在目標(biāo) Bean 添加 @Primary |
需要臨時覆蓋默認(rèn)注入 | 配合 @Qualifier 指定名稱 |
關(guān)鍵點(diǎn):@Primary
是 Spring 解決依賴注入歧義性的輕量級方案,通過隱式指定默認(rèn) Bean 簡化配置,但在需要精確控制的場景中仍需結(jié)合 @Qualifier
使用。
到此這篇關(guān)于Spring中@Primary注解的作用與使用的文章就介紹到這了,更多相關(guān)Spring @Primary內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?ArrayList集合之解鎖數(shù)據(jù)存儲新姿勢
這篇文章主要介紹了Java?ArrayList集合之解鎖數(shù)據(jù)存儲新姿勢,ArrayList是一個動態(tài)數(shù)組,可以自動調(diào)整大小,并提供了豐富的操作方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03java實(shí)現(xiàn)PPT轉(zhuǎn)PDF出現(xiàn)中文亂碼問題的解決方法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)PPT轉(zhuǎn)PDF出現(xiàn)中文亂碼問題的解決方法,進(jìn)行了詳細(xì)的問題分析,需要的朋友可以參考下2015-11-11基于SpringMVC中的路徑參數(shù)和URL參數(shù)實(shí)例
這篇文章主要介紹了基于SpringMVC中的路徑參數(shù)和URL參數(shù)實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02java 實(shí)現(xiàn)黃金分割數(shù)的示例詳解
這篇文章主要介紹了java 實(shí)現(xiàn)黃金分割數(shù)的示例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02java怎么創(chuàng)建目錄(刪除/修改/復(fù)制目錄及文件)代碼實(shí)例
這篇文章主要介紹了java怎么創(chuàng)建目錄,還包括刪除/修改/復(fù)制目錄及文件,代碼簡單,下面直接看代碼吧2013-12-12關(guān)于SpringBoot中事務(wù)失效的幾種情況
這篇文章主要介紹了關(guān)于SpringBoot中事務(wù)失效的幾種情況,Spring AOP默認(rèn)使用動態(tài)代理,會給被代理的類生成一個代理類,事務(wù)相關(guān)的操作都通過代理來完成,使用內(nèi)部方法調(diào)用時,使用的是實(shí)例調(diào)用,沒有通過代理類調(diào)用方法,因此事務(wù)不會檢測到失敗,需要的朋友可以參考下2023-08-08