Spring中@Primary注解的作用與使用
在 Spring 框架中,@Primary 注解用于解決依賴注入時的歧義性(Ambiguity)問題。當(dāng) Spring 容器中存在多個相同類型的 Bean 時,通過 @Primary 標(biāo)記其中一個 Bean 作為默認的首選注入對象。
核心作用:
解決多個同類型 Bean 的沖突當(dāng)有多個實現(xiàn)同一接口或相同類型的 Bean 時,Spring 無法自動確定注入哪個 Bean,會拋出
NoUniqueBeanDefinitionException。使用@Primary可指定默認注入的 Bean。隱式選擇優(yōu)先級被標(biāo)記為
@Primary的 Bean 會被優(yōu)先注入,無需額外使用@Qualifier指定名稱。
使用示例:
場景定義
假設(shè)有一個支付接口 PaymentService 和兩個實現(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)記其中一個實現(xiàn)類為默認首選:
@Component
@Primary // 指定為默認注入的 Bean
public class AlipayService implements PaymentService { ... }
此時注入會成功選擇 AlipayService:
@Autowired private PaymentService paymentService; // 隱式注入 AlipayService
與其他注解的優(yōu)先級:
@Primaryvs@Qualifier@Qualifier顯式指定 Bean 名稱的優(yōu)先級高于@Primary。- 例如:
@Autowired @Qualifier("creditCardService")會覆蓋@Primary。
多個
@Primary的沖突如果多個同類型 Bean 都被標(biāo)記為@Primary,Spring 會再次拋出歧義異常。
常見使用場景:
- 數(shù)據(jù)庫多數(shù)據(jù)源配置在多個
DataSourceBean 中,標(biāo)記默認使用的數(shù)據(jù)源。 - 不同環(huán)境下的實現(xiàn)類例如在測試和生產(chǎn)環(huán)境中提供同一接口的不同實現(xiàn),通過
@Primary切換默認實現(xiàn)。 - 第三方庫的擴展當(dāng)覆蓋第三方庫提供的 Bean 時,將自己的實現(xiàn)標(biāo)記為
@Primary。
配置方式:
除了注解在類上,也可以在 @Bean 方法中使用:
@Configuration
public class AppConfig {
@Bean
@Primary // 標(biāo)記此 Bean 為首選
public PaymentService alipayService() {
return new AlipayService();
}
}
總結(jié):
| 場景 | 解決方案 |
|---|---|
| 多個同類型 Bean,需默認注入一個 | 在目標(biāo) Bean 添加 @Primary |
| 需要臨時覆蓋默認注入 | 配合 @Qualifier 指定名稱 |
關(guān)鍵點:@Primary 是 Spring 解決依賴注入歧義性的輕量級方案,通過隱式指定默認 Bean 簡化配置,但在需要精確控制的場景中仍需結(jié)合 @Qualifier 使用。
到此這篇關(guān)于Spring中@Primary注解的作用與使用的文章就介紹到這了,更多相關(guān)Spring @Primary內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java課設(shè)案例之百行代碼實現(xiàn)簡易計算器
下面這篇文章主要給大家介紹了關(guān)于Java課設(shè)案例之百行代碼實現(xiàn)簡易計算器的相關(guān)資料,這是一個關(guān)于java簡單計算器的完整課程設(shè)計以及源碼,需要的朋友可以參考下2023-06-06
如何基于ThreadPoolExecutor創(chuàng)建線程池并操作
這篇文章主要介紹了如何基于ThreadPoolExecutor創(chuàng)建線程池并操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
把Java程序轉(zhuǎn)換成exe,可直接運行的實現(xiàn)
這篇文章主要介紹了把Java程序轉(zhuǎn)換成exe,可直接運行的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java統(tǒng)計英文句子中出現(xiàn)次數(shù)最多的單詞并計算出現(xiàn)次數(shù)的方法
這篇文章主要介紹了Java統(tǒng)計英文句子中出現(xiàn)次數(shù)最多的單詞并計算出現(xiàn)次數(shù)的方法,涉及java針對英文句子的字符串遍歷、轉(zhuǎn)換、正則替換、計算等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01

