Существует довольно широкое обсуждение этого вопроса: как обновить свойства без какого-либо сервера конфигурации.На этом здесь есть пост Дейва Сайера, который дает некоторый свет - но все еще не говорит о себе.
Наиболее естественным подходом для spring-boot / -cloud будет следующий (как обсуждено на github-config-cloud-cloud ):
@Component
@ConfigurationProperties("ignored")
@RefreshScope
public class Config {
private List<String> path;
public List<String> getPath() {
return path;
}
public void setPath(List<String> path) {
this.path = path;
}
}
Это не такt работает из-за некоторых проблем с прокси между @RefreshScope
и @ConfigurationProperties
- обе аннотации приводят к тому, что прокси-компоненты bean не соответствуют друг другу.
Поэтому я начал смотреть на это с точки зрения весны.PropertySources доступны через Environment
, поэтому вы можете получить к ним доступ и изменить их с помощью
final String propertySourceName = "externalConfiguration";
// name of propertySource as defined by
// @PropertySource(name = "externalConfiguration", value = "${application.config.location}")
ResourcePropertySource propertySource = new ResourcePropertySource(propertySourceName, new FileSystemResource(file));
MutablePropertySources sources = ctx.getEnvironment().getPropertySources();
sources.replace(propertySourceName, propertySource);
Мой пример использования был основан на «редактировании пользователем файла», поэтому обновленные свойства основывались на FileSystemWatcher, который изменялpropertySources.Для того чтобы исходные тексты были правильно загружены компонентом конфигурации, область действия компонента должна была быть прототипом - корректно перестраиваться при каждом вызове.
Полный пример доступен в виде гистограммы .Конфиг-сервер не включен вообще.Надеюсь, это поможет