Wer für unterschiedliche Umgebungen eine Spring Anwendung entwickelt, kennt am Anfang das typische Problem. Wie bekommt meine Spring Spring Boot Applikation die Werte für Datenbank und anderes übergeben. Wie kann ich auch mehrere Konfigurationsdateien für Spring verwenden? Dafür bietet Spring mehrere Varianten und Lösungen. Ich zeig dir hier schnelle Möglichkeiten der Konfiguration für deine Spring Applikation. Natürlich auch verwendbar für Spring Boot.
Kommandozeile
Zum einen könnt ihr dies beim Starten der Applikation per Kommandozeilenparameter machen
java -jar my-application.jar --my.setting=my.value
Meist werdet ihr das über eine Konfigurationsdatei, Properties File, machen. In der Regel heißt diese z.B. application.properties. Manchmal auch application.yaml. Grundsätzlich kann diese frei benannt werden. Die Konfiguration wird dann selbst im JSON oder YAML Format eingetragen.
Auch diese könnt ihr extern, über Kommandozeilenparameter, angeben.
java -jar -Dspring.config.location=path/to/my/application.properties my-application.jar
Übergabe per Annotation
Es ist aber auch möglich die Konfigurationsdatei für Spring direkt im Code an der Konfigurationsklasse, die per @Configuration Annotation eingeleitet wird, einzubinden. Hierfür wird die Annotation @PropertySource verwendet.
@PropertySource(value ="classpath:application.properties")
@PropertSource kann auch den Parameter ignoreResourceNotFound=true bekommen. Default ist diese automatisch false. Aber vielleicht wollt ihr eure Parameter je nach Szenario auch nach einen der anderen Methoden setzen. Mit
@PropertySource(value ="classpath:application.properties", ignoreResourceNotFound=true)
wird er das Fehlen der application.properties nicht beim Programmstart mit einer Exception quittieren.
Mehrere Konfigurationsdateien für deine Spring Applikation
Manchmal existieren für verschiedene Umgebungen auch verschiedene Konfigurationsdateien. So wollt ihr für eure Umgebungen andere Konfigurationsdateien verwenden oder aber ihr lagert Teile der Konfiguration in verschiedene Dateien aus. Zum Beispiel wenn ihr die Datenbank Konfiguration von anderen trennen wollt.
Spring bietet mit @PropertySources eine Annotation um mehrere @PropertySource zu sammeln. Das sieht dann so aus:
@PropertySources( value = {
@PropertySource(value ="classpath:default_application.properties", ignoreResourceNotFound=true),
@PropertySource(value ="file:/opt/DIR/db_application.properties", ignoreResourceNotFound=true ),
@PropertySource(value ="file:C:/Users/USERNAME/web_application.properties", ignoreResourceNotFound=true )
})
Variable/Property mehrfach angegeben
Die Reihenfolge der Angaben hat auch eine Bedeutung. Diese werden von der Reihenfolge der Angabe eingelesen. Bei mehreren Konfigurationsdateien kann es vorkommen, dass ihr eine Einstellung mehrfach angegeben hat. Spring verwendet dann die, die zuletzt angeben wurde. So dass ihr auch mit dem Überschreiben der Konfiguration, je nach Umgebung, auch spielen könnt. So könnt ihr z.B. an erster Selle eine default application.properties angeben um gewissen Standardeinstellungen zu setzen, die dann je nach Umgebung überschrieben werden.
Beispiel
@Configuration@PropertySources( value = {
@PropertySource(value ="classpath:application.properties", ignoreResourceNotFound=true),
@PropertySource(value ="file:/opt/dTale/flow_service_application.properties", ignoreResourceNotFound=true ),
@PropertySource(value ="file:C:/Users/mburbach/flow_service_application.properties", ignoreResourceNotFound=true )
})
public class AppConfig {
@Autowired
private transient Environment environment;
@Bean
public String getMySetting() {
return this.environment.getProperty("my.setting");
}
}
Das soll es für den schnellen Überblick erstmal gewesen sein. Happy Coding.
Referenzen: