PropertyPlaceholderConfigurer env properties , ${_ var: MY_ENV_OR_PROPERTY}
: -Denv = -dev , : jdbc-dev.properties.
jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://${_var:MARIADB_SERVICE_HOST}:${_var:MARIADB_SERVICE_PORT}/mydb?serverTimezone=UTC&useSSL=false&autoReconnect=true
jdbc.username=root
applicationContext.xml
<bean id="jdbc-properties" class="com.naskar.spring.VariablePropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc#{systemProperties['env']}.properties"/>
<property name="searchSystemEnvironment" value="true"/>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
VariablePropertyPlaceholderConfigurer.java
class VariablePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
private static String resolveValueWithEnvVars(String value) {
if (null == value) {
return null;
}
Pattern p = Pattern.compile('\\$\\{_var:(\\w+)\\}|\\$(\\w+)');
Matcher m = p.matcher(value);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String envVarName = null == m.group(1) ? m.group(2) : m.group(1);
String envVarValue = System.getProperty(envVarName);
if(envVarValue == null) {
envVarValue = System.getenv(envVarName);
}
m.appendReplacement(sb, null == envVarValue ? "" : Matcher.quoteReplacement(envVarValue));
}
m.appendTail(sb);
return sb.toString();
}
@Override
protected String convertPropertyValue(String originalValue) {
return resolveValueWithEnvVars(originalValue);
}
}