Получить доступ

Интерфейс PaymentGateway реализуют два бина: один помечен @Primary, другой имеет имя sbpGateway. В точке внедрения стоит @Qualifier("sbpGateway"). Какой бин будет внедрён?

MiddleСтереотипы и автосвязываниеSpring
Ещё спрашивают так:
  • Что сильнее — @Primary или @Qualifier?
Коротко

@Qualifier в точке внедрения сильнее @Primary: явное указание перекрывает умолчание. Будет внедрён sbpGateway.

  • @Primary — выбор по умолчанию там, где ничего не уточнено
  • Квалификатор — имя бина или своя аннотация-квалификатор
  • Без обоих при двух кандидатах — NoUniqueBeanDefinitionException

А ещё Сравнение по имени параметра — последний и самый хрупкий уровень

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Логика разрешения такая: сначала отбираются кандидаты по типу; если их несколько, учитывается @Qualifier в точке внедрения, затем @Primary, затем совпадение имени бина с именем переменной. @Primary задаёт умолчание для всех мест, где выбор не уточнён, а @Qualifier — адресное решение для конкретной точки. Если ни один механизм не сработал, контейнер падает при старте с NoUniqueBeanDefinitionException — и это правильное поведение, потому что ошибка обнаруживается сразу. Для более выразительного разделения вместо строкового имени часто заводят собственную аннотацию с @Qualifier.

Что хотят услышать

  • Приоритет квалификатора.
  • Роль @Primary.

Частые ошибки

  • Считать @Primary безусловным победителем.
  • Полагаться на совпадение имени переменной с именем бина как на основной механизм.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓sbpGateway: явный @Qualifier имеет приоритет над @Primary
  • ✗Бин с @Primary: он всегда побеждает
  • ✗Будет NoUniqueBeanDefinitionException из-за конфликта
  • ✗Выбор недетерминирован и зависит от порядка сканирования

Что спросят дальше

  • Что произойдёт, если внедрить List<PaymentGateway>?
  • Чем удобна собственная аннотация вместо строкового квалификатора?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем