Ответ
Аннотация @Qualifier является частью реализации паттерна Dependency Injection (Внедрение зависимостей) в Spring. Она решает проблему неоднозначности внедрения (ambiguity), когда контейнеру необходимо выбрать один бин среди нескольких кандидатов одного типа.
Проблема:
@Component
class SmsService implements NotificationService { /*...*/ }
@Component
class EmailService implements NotificationService { /*...*/ }
@Service
class UserService {
@Autowired // ОШИБКА: Какой бин внедрить? SmsService или EmailService?
private NotificationService notifier;
}
Решение с @Qualifier:
@Component
@Qualifier("sms")
class SmsService implements NotificationService { /*...*/ }
@Component
@Qualifier("email")
class EmailService implements NotificationService { /*...*/ }
@Service
class UserService {
@Autowired
@Qualifier("email") // Четкое указание, какую реализацию использовать
private NotificationService notifier;
}
Почему это часть DI:
@Qualifier предоставляет механизм для уточнения или квалификации зависимости, которую контейнер должен разрешить, что является важным аспектом гибкого и точного управления внедрением.