Для решения вашей проблемы вы можете использовать библиотеку spring-cloud-context и ее аннотацию @RefreshScope
.Кроме того, вам необходимо немного развить.
1) Вам нужен специальный компонент-наблюдатель, который будет следить за изменением пароля.Это будет что-то вроде этого:
@Service
public class Watcher {
private final ContextRefresher refresher;
public Watcher(ContextRefresher refresher) {
this.refresher = refresher;
}
@Scheduled(fixedDelay = 10000L)
public void monitor() {
if (/* smth changed*/) {
refresher.refresh();
}
}
}
Итак, когда вы вызываете refresher.refresh();
, все бины, отмеченные @RefreshContext
, будут удалены и воссозданы после первого доступа к ним.
2) Аннотируйте ваш компонент источника данных с аннотацией @RefreshContext
.3) Вы должны предоставить пароль для доступа, используя аннотацию @ConfigurationProperties
.Вам нужно будет создать SourceLocator.Это будет что-то вроде этого
@Order(0)
public class SourceLocator implements PropertySourceLocator {
@Override
public PropertySource<?> locate(Environment environment) {
//Load properties to hash map
return new MapPropertySource("props", new HashMap<>());
}
}
Также создайте файл spring.factories и поместите туда следующие данные:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.test.YourSourceLocator
4) Создать класс свойствгде ваш проход БД будет храниться и обновляться.
@RefreshScope
@ConfigurationProperties(prefix="your.prefix")
public class Properties {
private String dbPassword;
}
Автоматически связать этот bean-компонент с конфигурацией, в которой вы создаете свой источник данных и используете пароль из него.