Вопрос с собеседования · Spring

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования