我有多个属性文件,一个名为application.properties的通用文件和一个名为[HostName] .properties
的更具体的属性文件Hostname.properties设置为优先于application.properties。
在application.properties中,我设置了db.url:
db.url=jdbc:mysql://${db.host}:3306/${db.schema}?autoReconnect=true&sessionVariables=storage_engine=InnoDB;
我还在此属性文件中设置了db.host和db.schema值。
db.schema=default
db.host=localhost
然后在[Hostname] .properties中我想覆盖db.host和db.schema的值:
db.schema=specific
db.host=specific_hostname
但是,似乎这种嵌套不起作用。
db.schema值解析为“specific”,但db.url属性解析为与db.url定义在同一文件中指定的db.schema。
请考虑以下测试代码段:
@Value("${db.url}")
private String dbUrl;
@Value("${db.schema}")
private String dbSchema;
@Test
public void testUrlTest() {
System.out.println(dbUrl);
System.out.println(dbSchema);
}
打印出的第一个值是
JDBC:MySQL的://本地主机:3306 /默认autoReconnect的=真安培; sessionVariables = STORAGE_ENGINE = InnoDB的;
第二个值是:
特定
这是设计的吗?我希望能够从一个属性配置器覆盖嵌套到下一个。
有什么方法吗?
更新: 属性占位符在spring config xml中配置如下:
<context:property-placeholder order="10"
location="classpath:xxx.yyy/application.properties"
ignore-unresolvable="true" ignore-resource-not-found="false" />
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" ref="hostnameLookup" />
<property name="ignoreResourceNotFound" value="true" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="order" value="5" />
</bean>
<bean class="xxx.yyy.util.HostNameLookupFactory" id="hostnameLookup"
autowire-candidate="false">
<property name="prefix" value="classpath:xxx.yyy/" />
<property name="suffix" value=".properties" />
</bean>
HostNameLookupFactory是一个提供本地主机名的工厂bean。