跨属性占位符配置器的嵌套属性

时间:2012-04-25 09:50:21

标签: java spring

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

0 个答案:

没有答案