1

我有多个属性文件,一个名为 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。

4

0 回答 0