Выбор ответа Middle IoC и внедрение зависимостей обновлено

Внедрение всех реализаций

Вопрос

Как получить все бины, реализующие PaymentProvider, чтобы выбрать нужный по коду провайдера?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Внедрить List<PaymentProvider или Map<String, PaymentProvider. Spring умеет внедрять коллекции: в List попадут все бины типа (порядок можно задать @Order), в Map ключами будут имена бинов.

Варианты ответа

  1. Внедрить List<PaymentProvider> или Map<String, PaymentProvider>правильный ответ
  2. Вызывать new для каждой реализации прямо в сервисе
  3. Только через applicationContext.getBeansOfType в каждом методе
  4. Никак: Spring внедряет только один бин на тип, остальные игнорируются

Разбор

Spring умеет внедрять коллекции: в List попадут все бины типа (порядок можно задать @Order), в Map ключами будут имена бинов. Это стандартный способ реализовать стратегию без switch. getBeansOfType тоже работает, но превращает DI в service locator. Через new бины потеряют управление контейнером.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.