Używasz springa, więc to nie jest aż tak dużo pracy. Jeżeli chcesz polecieć „na grubo”, to jest Spring Cloud Config, czyli stawiasz sobie serwer, który będzie ci serwował konfigurację jako endpoint. W docelowej aplikacji konfigurujesz sobie źródło na tym serwerze i wio. ALE to jest na prawdę na grubo.
Wersja prostsza, acz nie aż tak elegancka, to implementacja EnvironmentPostProcessor
, w której dociągasz odpowiednie wartości:
public class ReadDbPropertiesPostProcessor implements EnvironmentPostProcessor {
private static final String PROPERTY_SOURCE_NAME = "databaseProperties";
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Map<String, Object> propertySource = new HashMap<>();
try {
DataSource ds = DataSourceBuilder
.create()
.username(USERNAME) //
.password(PASSWORD) //
.url(DATASOURCE-URL)//
.driverClassName(DRIVER) // to musisz wyciągnąć z environment
.build();
PreparedStatement preparedStatement = ds.getConnection().prepareStatement("SELECT name, value FROM propertyConfig WHERE service = ?");
preparedStatement.setString(1, APP_NAME);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
String propName = rs.getString("name");
propertySource.put(propName, rs.getString("value"));
}
environment.getPropertySources().addFirst(new MapPropertySource(PROPERTY_SOURCE_NAME, propertySource));
} catch (Exception e) {
throw new RuntimeException("Error fetching properties from db");
}
}
}
I następnie w musisz stworzyć plik src/main/resources/META-INF/spring.factories
i dodać w nim:
org.springframework.boot.env.EnvironmentPostProcessor=com.your.package.ReadDbPropertiesPostProcessor
To wszystko.