我有多个属性文件,一个名为 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 值解析为“特定”,但 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://localhost:3306/default?autoReconnect=true&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。