Задать вопрос
@sieur

Spring: как получить одну реализацию интерфейса из множества?

Вопрос по Java Spring. Есть несколько реализаций, я хочу в классе-фасаде получать из контекста реализацию в зависимости от enum (например). Как это грамотно сделать в коде метода? Не в поле класса. Нужна best practice.

Наглядная иллюстрация (кликните для увеличения):
5dcf01f5edfd4492441063.png
Я вижу варианты:

Склеивать id бина из этого enum, и получать по id нужный бин. Можно вынести в отдельный класс-провайдер бинов. Придётся соблюдать некоторое соглашение, но это не большая проблема.
Как-то урезать контекст до нужного пакета (toyota или bmw), и уже искать в нём по интерфейсу. Но урезать контекст без пересоздания, вроде как, нельзя, так что тоже не вариант.
Мне кажется, что оба подхода не очень. Думал инжектить более узкие контексты в зависимости от enum, но инжект контекста вообще плохая практика, по словам Евгения Борисова.

Как это грамотно сделать с помощью Spring? Объекты, реализующие интерфейсы Cleaner, EngineDiagnoster и WheelsChanger содержат поля, помеченные @Autowired и @Resource, поэтому без спринга создавать эти объекты нельзя.
  • Вопрос задан
  • 347 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@Bonce
Объявите Фасад бином, и внедряйте в него нужные вам бины. Вы можете написать что-то типа:
@Autowired
Map<String, Car> cars;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы