使用Spring我需要某种环境(dev | test | prod)特定属性。
我只有一个配置文件(myapp.properties),由于某些原因,我不能有多个配置文件(即使spring也可以处理多个)。
所以我需要添加带有
前缀的属性dev.db.user=foo
prod.db.user=foo
告诉应用程序使用哪个前缀(环境)与-Denv-target
之类的VM参数或类似的东西。
答案 0 :(得分:5)
我为此目的使用了PropertyPlaceholderConfigurer
:
public class EnvironmentPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
private static final String ENVIRONMENT_NAME = "targetEnvironment";
private String environment;
public EnvironmentPropertyPlaceholderConfigurer() {
super();
String env = resolveSystemProperty(ENVIRONMENT_NAME);
if (StringUtils.isNotEmpty(env)) {
environment = env;
}
}
@Override
protected String resolvePlaceholder(String placeholder, Properties props) {
if (environment != null) {
String value = props.getProperty(String.format("%s.%s", environment, placeholder));
if (value != null) {
return value;
}
}
return super.resolvePlaceholder(placeholder, props);
}
}
并在applicationContext.xml
(或任何其他弹簧配置文件)中使用它:
<bean id="propertyPlaceholder"class="EnvironmentPropertyPlaceholderConfigurer">
<property name="location" value="classpath:my.properties" />
</bean>
在my.properties
中,您可以定义以下属性:
db.driverClassName=org.mariadb.jdbc.Driver
db.url=jdbc:mysql:///MyDB
db.username=user
db.password=secret
prod.db.username=prod-user
prod.db.password=verysecret
test.db.password=notsosecret
因此,您可以通过环境键(例如prod
)为属性键添加前缀。
使用vm参数targetEnvironment
,您可以选择您要使用的环境,例如: -DtargetEnvironment=prod
。
如果不存在特定于环境的属性,则选择默认属性(不带前缀)。 (您应该始终定义默认值。)
答案 1 :(得分:2)
我不知道你有什么限制可以避免使用多个配置文件,但你可以使用像-Denvtarget = someValue这样的东西并在java中执行:
//Obtain the value set in the VM argument
String envTarget= System.getProperty("env-target");
Properties properties;
try {
properties = PropertiesLoaderUtils.loadAllProperties("myapp.properties");
} catch (IOException exception) {
//log here that the property file does not exist.
}
//use here the prefix set in the VM argument.
String dbUser = properties.getProperty(envTarget+".db.user");
答案 2 :(得分:2)
如果您有环境变量并希望根据此变量获取属性,则可以通过以下方式声明属性:
<property name="username" value="${${env-target}.database.username}" />
<property name="password" value="${${env-target}.database.password}" />
还要确保使用正确配置的property-placeholder:
<context:property-placeholder location="classpath*:META-INF/spring/*.properties"/>
或者,如果您使用特殊属性配置器(例如EncryptablePropertyPlaceholderConfigurer),请设置属性:
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
但如前所述,最好使用个人资料。