Что делает аннотация @Qualifier в Spring?

«Что делает аннотация @Qualifier в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

@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 обеспечивает точный контроль над процессом внедрения зависимостей в ситуациях, когда тип интерфейса недостаточен для однозначной идентификации требуемой реализации.