Это упрощенная версия того, чего я пытаюсь достичь. У меня есть несколько реализаций одного и того же интерфейса. Основываясь на пользовательском входе во время выполнения, я хочу выбрать правильную реализацию.Решения переключателя пружин, основанные на рабочем состоянии
Например, предположим, что интерфейс называется Color. Существует много классов, реализующих этот интерфейс, класс Red, класс Blue, класс Green и т. Д.
Во время выполнения мне нужно выбрать реализации на основе пользовательского ввода. Одним из способов достижения этой цели было бы что-то вроде этого
@Autowired
@Qualifier("Red")
private Color redColor;
@Autowired
@Qualifier("Green")
private Color greenColor;
private Color getColorImplementation()
{
if(userInput=="red")
{
return redColor;
}
else if(userInput=="green")
{
return greenColor;
}
else
{
return null;
}
}
Но проблема состоит в том, что каждый раз, когда добавляется новая реализация, я бы обновить код, который выбирает реализацию, который бьет целую цель обращения контрольной части пружины. Каков правильный способ сделать это с помощью весны?
Очень хорошее решение. Вы можете даже улучшить его, если вы будете объявлять 'Map colors' вместо' List'. Затем новый цвет должен быть объявлен с помощью '@Component (" colorName ")'. В этом случае вы даже можете сделать несколько имен синонимов для одного цвета, и не нужно, чтобы класс 'Color' ничего не знал о разрешении цвета. –
@Ken: Я думаю, что ваш комментарий должен быть частью ответа. Я в конечном итоге использовал карту так, как вы предлагали, а затем извлекал элементы с карты по имени, объявленному в @Component («BeanName»). Отлично! – developer747
@ developer747 Я был рад помочь. Основная идея - список атрибутов bean в зависимости от базового типа, предложенный zapl. Другое это просто детали. –