Khi có nhiều bean cùng type, Spring không biết inject cái nào → dùng @Primary hoặc @Qualifier để phân biệt.
interface MailSender { void send(String to, String msg); }
@Component("smtpSender")
class SmtpMailSender implements MailSender {}
@Component("mockSender")
@Primary
class MockMailSender implements MailSender {}@Primary: chỉ định 1 bean làm default khi có nhiều candidate:
// inject MockMailSender vì nó @Primary
class NotificationService {
NotificationService(MailSender sender) {}
}@Qualifier: chỉ định tên bean cụ thể — ghi đè @Primary:
class OrderService {
OrderService(@Qualifier("smtpSender") MailSender sender) {}
}Khi nào dùng gì:
- @Primary — 1 bean là "default sensible choice" (ví dụ: production impl).
- @Qualifier — điểm inject cụ thể cần bean khác.
- Nên kết hợp với @Profile để switch impl theo env.
When there are multiple beans of the same type, Spring does not know which to inject → use @Primary or @Qualifier.
interface MailSender { void send(String to, String msg); }
@Component("smtpSender")
class SmtpMailSender implements MailSender {}
@Component("mockSender")
@Primary
class MockMailSender implements MailSender {}@Primary: designates one bean as the default:
// injects MockMailSender because it is @Primary
class NotificationService {
NotificationService(MailSender sender) {}
}@Qualifier: specifies the exact bean name — overrides @Primary:
class OrderService {
OrderService(@Qualifier("smtpSender") MailSender sender) {}
}When to use which:
- @Primary — one bean is the "sensible default" (e.g. the production impl).
- @Qualifier — a specific injection point needs a different bean.
- Combine with @Profile to swap impls per environment.