Интерфейс PaymentGateway реализуют два бина: один помечен @Primary, другой имеет имя sbpGateway. В точке внедрения стоит @Qualifier("sbpGateway"). Какой бин будет внедрён?
- Что сильнее — @Primary или @Qualifier?
@Qualifier в точке внедрения сильнее @Primary: явное указание перекрывает умолчание. Будет внедрён sbpGateway.
- @Primary — выбор по умолчанию там, где ничего не уточнено
- Квалификатор — имя бина или своя аннотация-квалификатор
- Без обоих при двух кандидатах — NoUniqueBeanDefinitionException
А ещё Сравнение по имени параметра — последний и самый хрупкий уровень
Подробно
Логика разрешения такая: сначала отбираются кандидаты по типу; если их несколько, учитывается @Qualifier в точке внедрения, затем @Primary, затем совпадение имени бина с именем переменной. @Primary задаёт умолчание для всех мест, где выбор не уточнён, а @Qualifier — адресное решение для конкретной точки. Если ни один механизм не сработал, контейнер падает при старте с NoUniqueBeanDefinitionException — и это правильное поведение, потому что ошибка обнаруживается сразу. Для более выразительного разделения вместо строкового имени часто заводят собственную аннотацию с @Qualifier.
Что хотят услышать
- Приоритет квалификатора.
- Роль @Primary.
Частые ошибки
- Считать @Primary безусловным победителем.
- Полагаться на совпадение имени переменной с именем бина как на основной механизм.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Бин с @Primary: он всегда побеждает при нескольких кандидатах
- ✗Будет NoUniqueBeanDefinitionException из-за конфликта
- ✗Выбор недетерминирован и зависит от порядка сканирования
- ✓sbpGateway: явный @Qualifier важнее @Primary
Что спросят дальше
- Что произойдёт, если внедрить List<PaymentGateway>?
- Чем удобна собственная аннотация вместо строкового квалификатора?
Разбор темы
- Стереотипы, @Bean и автосвязывание
Стереотипные аннотации и их семантика, @Bean против @Component, component-scan, @Autowired и разрешение неоднозначности.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.