Какой паттерн проектирования реализует аннотация @Qualifier в Spring Framework?

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

Ответ

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