Для чего используется аннотация @Qualifier в Spring?

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

Ответ

@Qualifier — это аннотация Spring Framework, которая уточняет, какой конкретно бин должен быть внедрен (autowired), когда в контексте приложения существует несколько бинов, реализующих один и тот же тип (интерфейс или класс). Без нее Spring выбросит исключение NoUniqueBeanDefinitionException.

Пример проблемы и решения:

  1. Два бина одного типа:

    @Component("firstService")
    public class FirstService implements MyService { /* ... */ }
    
    @Component("secondService")
    public class SecondService implements MyService { /* ... */ }
  2. Внедрение с @Qualifier:

    @Service
    public class ClientService {
        @Autowired
        @Qualifier("firstService") // Явно указываем имя бина для внедрения
        private MyService service;
    }

Альтернативы и дополнения:

  • @Primary: Аннотация, помечающая один бин как предпочтительный по умолчанию.
  • Имя поля: Если имя поля совпадает с именем бина (например, firstService), Spring может внедрить его без @Qualifier.
  • Кастомные квалификаторы: Можно создавать собственные аннотации, помеченные @Qualifier, для более семантичного выбора.