В веб-приложении java- spring я хотел бы динамически вводить beans. Например, у меня есть интерфейс с двумя различными реализациями:
В моем приложении я использую файл свойств для настройки инъекций:
#Determines the interface type the app uses. Possible values: implA, implB
myinterface.type=implA
Мои инъекции, фактически загруженные, условно передают значения свойств в файле свойств. Например, в этом случае myinterface.type = implA, где бы я ни вводил MyInterface, реализация, которая будет введена, будет ImplA (я достиг этого, расширив Условную аннотацию).
Мне бы хотелось, чтобы во время выполнения - после изменения свойств произойдет следующее (без перезагрузки сервера):
- Будет введена правильная реализация. Например, при установке
myinterface.type=implB
ImplB будет вводиться, когда используется MyInterface - Spring Окружающая среда должна обновляться с новыми значениями и повторно вводиться также в beans.
Я думал об обновлении моего контекста, но это создает проблемы. Я подумал, может быть, использовать сеттеры для инъекций и повторно использовать эти сеттеры после повторной настройки свойств. Существует ли рабочая практика для такого требования?
Любые идеи?
UPDATE
Как я уже сказал, я могу использовать реестр factory/, который содержит обе реализации (ImplA и ImplB) и возвращает правильный, запрашивая соответствующее свойство. Если я это сделаю, у меня все еще есть вторая проблема - окружающая среда. например, если мой реестр выглядит следующим образом:
@Service
public class MyRegistry {
private String configurationValue;
private final MyInterface implA;
private final MyInterface implB;
@Inject
public MyRegistry(Environmant env, MyInterface implA, MyInterface ImplB) {
this.implA = implA;
this.implB = implB;
this.configurationValue = env.getProperty("myinterface.type");
}
public MyInterface getMyInterface() {
switch(configurationValue) {
case "implA":
return implA;
case "implB":
return implB;
}
}
}
Как только свойство изменилось, я должен повторно ввести свою среду. любые предложения для этого?
Я знаю, что могу запросить это env внутри метода вместо конструктора, но это снижение производительности, и я также хотел бы подумать об идре для повторной инъекции среды (опять же, возможно, используя инъекцию setter?).