Spring: Umgebungsspezifische Properties

Oft benötigen Spring-Beans Konfigurationswerte. Diese können durch Einbindung einer  speziellen Bean (z.B. PropertyPlaceHolderConfigurer) in Property-Dateien ausgelagert werden. In den Bean-Definitionen kann dann mit ${property-name} auf diese Properties zugegriffen werden.

Allerdings sind viele Properties (z.B. Datenbank- oder eMail-Konfiguration) in Projekten abhängig von der jeweiligen Umgebung (Entwicklung, Test, Produktion, …)

Eine Variante unterschiedlichen Umgebungen unterschiedliche Properties zur Verfügung zu stellen, ist die Verwendung unterschiedlicher Property-Dateien für unterschiedliche Umgebungen (z.B. durch ein ant-Skript). Jedoch ist das oftmals umständlich zu konfigurieren und durch die entstehende Redundanz fehleranfällig in der Wartung.

Eine meiner Meinung nach bessere Alternative ist die Properties mit einem umgebungsspezifischem Präfix zu erweitern:

dev.db.user=mysql
dev.db.password=mysql
prod.db.user=mysql
prod.db.password=gtrz56jioj

Damit das funktioniert muss eine spezielle 'propertyPlaceholder-Bean’ eingebunden werden.

<bean id="propertyPlaceholder class="de.thksystems.util.spring.EnvironmentPropertyPlaceholderConfigurer">
<property name="location" value="classpath:your.properties" />
</bean>

(Die Klasse EnvironmentPropertyPlaceholderConfigurer kann hier heruntergeladen werden und benötige neben einer Spring-Umgebung die Apache-Commons-Lang-Bibliothek.)

Über das VM-Kommandozeilenargument -DtargetEnvironment=XXX kann dann die aktuelle Umgebung gesetzt werden. (z.B. -DtargetEnvironment=dev)

Für den Fall, dass keine Umgebung gesetzt wird, ist es sinnvoll Default-Properties (ohne Prefix) zu haben, also z.B. so:

db.user=mysql
db.password=mysql
prod.db.password=gtrz56jioj

Sicherheitshinweis: Natürlich ist es unter bestimmten Bedingungen nicht sinnvoll allen Entwicklern Einblick in die Daten für bestimmte Umgebungen zu geben.