Spring中@Primary注解的作用及小demo演示
一、@Primary注解的核心作用
@Primary是Spring框架中用于解決依賴注入歧義問題的注解,當容器中存在多個相同類型的Bean時,Spring無法自動決定注入哪一個,此時通過@Primary標記某個Bean為“首選”,注入時會優(yōu)先選擇該Bean。其核心價值在于簡化默認Bean的選擇邏輯,避免在每個注入點都使用@Qualifier顯式指定。
二、@Primary的典型使用場景
-
多實現(xiàn)類沖突:一個接口有多個實現(xiàn)類(如
UserService有UserServiceImplA和UserServiceImplB),希望默認注入其中一個; -
多數(shù)據(jù)源配置:項目中需要連接多個數(shù)據(jù)庫(如MySQL和PostgreSQL),設置其中一個為默認數(shù)據(jù)源;
-
第三方庫集成:避免第三方庫的Bean與自定義Bean沖突,通過
@Primary指定優(yōu)先使用的實現(xiàn)。
三、小demo演示(接口多實現(xiàn)場景)
1. 定義接口與實現(xiàn)類
假設我們有一個MessageService接口,用于發(fā)送消息,有兩個實現(xiàn)類:EmailMessageService(發(fā)送郵件)和SmsMessageService(發(fā)送短信)。
// 接口定義
public interface MessageService {
void sendMessage(String content);
}
// 郵件服務實現(xiàn)(默認首選)
@Component
@Primary
public class EmailMessageService implements MessageService {
@Override
public void sendMessage(String content) {
System.out.println("【郵件】發(fā)送消息:" + content);
}
}
// 短信服務實現(xiàn)
@Component
public class SmsMessageService implements MessageService {
@Override
public void sendMessage(String content) {
System.out.println("【短信】發(fā)送消息:" + content);
}
}
2. 注入并使用接口
創(chuàng)建一個MessageController,通過構(gòu)造器注入MessageService,無需指定具體實現(xiàn):
@Component
public class MessageController {
private final MessageService messageService;
@Autowired
public MessageController(MessageService messageService) {
this.messageService = messageService;
}
public void send() {
messageService.sendMessage("Hello, Spring @Primary!");
}
}
3. 運行結(jié)果
啟動Spring應用(如通過AnnotationConfigApplicationContext加載配置),調(diào)用MessageController.send()方法,輸出結(jié)果為:
【郵件】發(fā)送消息:Hello, Spring @Primary!
原因:EmailMessageService被標記為@Primary,Spring在注入MessageService時優(yōu)先選擇了它。若移除@Primary注解,Spring會拋出NoUniqueBeanDefinitionException(多個相同類型Bean無法確定注入哪一個)。
四、關(guān)鍵說明
-
與@Qualifier的區(qū)別:
@Primary是全局默認選擇(適用于所有注入點),而@Qualifier是局部顯式指定(需在注入時明確指定Bean名稱,如@Qualifier("smsMessageService")); -
配置類中使用:若Bean通過
@Bean方法手動創(chuàng)建,同樣可以在方法上添加@Primary(如@Bean @Primary public MessageService emailMessageService())。
通過這個小demo,可以清晰看到@Primary如何解決多Bean注入的歧義問題,簡化默認Bean的選擇流程。
浙公網(wǎng)安備 33010602011771號