Как аннотация @Qualifier используется для разрешения зависимостей в Spring?

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

Ответ

Аннотация @Qualifier используется вместе с @Autowired для устранения неоднозначности (ambiguity) при внедрении зависимостей, когда в контексте Spring существует несколько бинов, подходящих по типу.

Проблема: Без @Qualifier Spring выбросит NoUniqueBeanDefinitionException.

@Component
class EmailService implements NotificationService { /* ... */ }

@Component
class SmsService implements NotificationService { /* ... */ }

@Service
class ClientService {
    @Autowired // ОШИБКА: два бина типа NotificationService
    private NotificationService service;
}

Решение с @Qualifier:

  1. Помечаем кандидатов квалификатором.
  2. Указываем тот же квалификатор при инжекции.
    
    @Component
    @Qualifier("email")
    class EmailService implements NotificationService { /* ... */ }

@Component @Qualifier("sms") class SmsService implements NotificationService { / ... / }

@Service class ClientService { @Autowired @Qualifier("email") // Явно указываем, какой бин внедрить private NotificationService service; }


**Альтернативы:** Использование `@Primary` для бина по умолчанию или инжекция по имени поля (если имя совпадает с именем бина).