Выбор ответа Middle IoC и внедрение зависимостей обновлено
Внедрение всех реализаций
Вопрос
Как получить все бины, реализующие PaymentProvider, чтобы выбрать нужный по коду провайдера?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Внедрить List<PaymentProvider или Map<String, PaymentProvider. Spring умеет внедрять коллекции: в List попадут все бины типа (порядок можно задать @Order), в Map ключами будут имена бинов.
Варианты ответа
- Внедрить
List<PaymentProvider>илиMap<String, PaymentProvider>правильный ответ - Вызывать
newдля каждой реализации прямо в сервисе - Только через
applicationContext.getBeansOfTypeв каждом методе - Никак: Spring внедряет только один бин на тип, остальные игнорируются
Разбор
Spring умеет внедрять коллекции: в List попадут все бины типа (порядок можно задать @Order), в Map ключами будут имена бинов. Это стандартный способ реализовать стратегию без switch. getBeansOfType тоже работает, но превращает DI в service locator. Через new бины потеряют управление контейнером.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.