Я не могу найти простой способ внедрить компонент/сервис с учетом значения времени выполнения.
Я начал читать @Spring doc: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers но я не могу найти там, как варьировать значения, переданные аннотации @Qualifier.
Допустим, у меня есть модель объекта с таким интерфейсом:
public interface Case {
String getCountryCode();
void setCountryCode(String countryCode);
}
В моем клиентском коде я бы сделал что-то вроде:
@Inject
DoService does;
(...)
Case myCase = new CaseImpl(); // ...or whatever
myCase.setCountryCode("uk");
does.whateverWith(myCase);
... с моим обслуживанием:
@Service
public class DoService {
@Inject
// FIXME what kind of #[email protected]& symbol can I use here?
// Seems like SpEL is sadly invalid here :(
@Qualifier("${caze.countryCode}")
private CaseService caseService;
public void whateverWith(Case caze) {
caseService.modify(caze);
}
}
Я ожидаю, что caseService будет UKCaseService (см. соответствующий код ниже).
public interface CaseService {
void modify(Case caze);
}
@Service
@Qualifier("uk")
public class UKCaseService implements CaseService {
}
@Service
@Qualifier("us")
public class USCaseService implements CaseService {
}
Итак, как мне "исправить" все это самым простым/элегантным/эффективным способом, используя одну или все функции Spring, так что, по сути, NO.properties, NO XML, только аннотации. Тем не менее, я уже подозреваю, что что-то не так в моем DoService, потому что Spring должен был бы знать "case", прежде чем вводить caseService... но как этого добиться, если клиентский код не знает о caseService?! Я не могу понять это...
Я уже читал несколько вопросов здесь о SO, но в большинстве случаев они либо не имеют таких же потребностей и/или конфигурации, что и я, либо опубликованные ответы не удовлетворяют меня (похоже, они по сути обходные пути или (старое) использование (старых) функций Spring).
Как Spring автоматически связывается по имени, когда найдено более одного совпадающего бина? => относится только к компонентоподобным классам
Динамическое определение того, какой bean-компонент должен автоматически подключаться в Spring (с использованием квалификаторов) => Действительно интересный, но самый сложный ответ (4 голоса)... почти 3,5 года?! (Июль 2013 г.)
Spring 3 - Динамическое автоматическое подключение во время выполнения на основе другого атрибута объекта => Довольно похожая проблема здесь, но ответ действительно выглядит как обходной путь, а не как реальный шаблон проектирования (например, фабрика)? и мне не нравится внедрять весь код в ServiceImpl, как это было...
Spring @Autowiring, как использовать фабрику объектов для выбора реализации? => 2-й ответ кажется интересным, но его автор не раскрывает, так что я немного знаю о Java Config & хм, я не совсем уверен, о чем он говорит...
Как внедрить различные сервисы во время выполнения на основе свойства Spring без XML => интересная дискуссия, особенно ответ, но у пользователя есть набор свойств, которых у меня нет.
Также прочитайте это: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html#expressions-bean-references => Я не могу найти расширенные примеры использования "@" в выражениях. Кто-нибудь знает об этом?
Редактировать: Нашли другие похожие на похожие вопросы, никто не получил правильный ответ: Как использовать @Autowired для динамического внедрения реализации как фабричного шаблона Spring Qualifier и заполнитель свойств Spring: использование @Qualifier с заполнителем свойства Как сделать условную автопроводку spring? Динамический впрыск spring SpEL в @Qualifier относится к одному и тому же компоненту Как использовать SpEL для вставки результата вызова метода в Spring?
Заводская модель может быть решением? Как использовать @Autowired для динамического внедрения реализации как фабричного шаблона