Ответ
@Qualifier — это аннотация Spring Framework, которая используется для уточнения (qualification) того, какой конкретно бин должен быть внедрен, когда в контексте приложения существует несколько бинов, подходящих по типу.
Проблема (без @Qualifier):
@Component
class FirstPaymentService implements PaymentService { /* ... */ }
@Component
class SecondPaymentService implements PaymentService { /* ... */ }
@Service
class OrderService {
@Autowired
private PaymentService paymentService; // ОШИБКА: Какой бин выбрать? First или Second?
}
Решение с @Qualifier:
@Component
@Qualifier("card") // Задаем квалификатор
class CardPaymentService implements PaymentService { /* ... */ }
@Component
@Qualifier("paypal")
class PayPalPaymentService implements PaymentService { /* ... */ }
@Service
class OrderService {
@Autowired
@Qualifier("card") // Явно указываем, какой бин нужен
private PaymentService paymentService;
}
Альтернативы и комбинации:
@Primary: Аннотация на одном из бинов, делающая его основным кандидатом по умолчанию.- Имя бина: Если не указан
@Qualifier, Spring попробует найти бин по имени поля (paymentService), но это ненадежно. -
Использование в конструкторе (рекомендуемый способ):
@Service class OrderService { private final PaymentService paymentService; public OrderService(@Qualifier("paypal") PaymentService paymentService) { this.paymentService = paymentService; } }Зачем это нужно?
@Qualifierобеспечивает точный контроль над процессом внедрения зависимостей в ситуациях, когда тип интерфейса недостаточен для однозначной идентификации требуемой реализации.