Spring占位符不解析JavaConfig中的属性

时间:2015-03-19 09:21:02

标签: java spring properties-file spring-java-config

目前我有一个Spring xml配置(Spring 4),它可以加载一个属性文件。

context.properties

my.app.service = myService
my.app.other = ${my.app.service}/sample

Spring xml配置

<bean id="contextProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="ignoreResourceNotFound" value="true" />
    <property name="fileEncoding" value="UTF-8" />
    <property name="locations">
        <list>
            <value>classpath:context.properties</value>
        </list>
    </property>
</bean>
<bean id="placeholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreResourceNotFound" value="true" />
    <property name="properties" ref="contextProperties" />
    <property name="nullValue" value="@null" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>

使用属性的Bean

@Component
public class MyComponent {

    @Value("${my.app.other}")
    private String others;

}

这完全有效,others值为MyService/sample,例外。但是当我尝试用JavaConfig替换这个配置时,我的组件中的@Value不能以相同的方式工作。该值不是myService/sample,而是${my.app.service}/sample

@Configuration
@PropertySource(name="contextProperties", ignoreResourceNotFound=true, value={"classpath:context.properties"})
public class PropertiesConfiguration {

    @Bean
    public static PropertyPlaceholderConfigurer placeholder() throws IOException {
        PropertyPlaceholderConfigurer placeholder = new PropertyPlaceholderConfigurer();
        placeholder.setNullValue("@null");
        placeholder.setSystemPropertiesMode(PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE);
        return placeholder;
    }

}

我是否遗漏了从xml到Javaconfig的转换内容?

ps:我还尝试实例化PropertySourcesPlaceholderConfigurer而不是PropertyPlaceholderConfigurer,但没有取得更多成功。

2 个答案:

答案 0 :(得分:3)

更新以使用configure PropertySourcesPlaceholderConfigurer。仅仅使用@PropertySource注释是不够的:

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
    return new PropertySourcesPlaceholderConfigurer();
}

@PropertySource注释不会自动向Spring注册PropertySourcesPlaceholderConfigurer。因此,我们需要明确配置PropertySourcesPlaceholderConfigurer

JIRA票据下面有关于此设计背后的基本原理的更多信息:

https://jira.spring.io/browse/SPR-8539

<强>更新 创建简单的Spring启动应用程序以使用嵌套属性。使用上述配置工作正常。

https://github.com/mgooty/property-configurer/tree/master/complete

答案 1 :(得分:1)

另一种选择是导入PropertyPlaceholderAutoConfiguration.class。

import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;

@Import(PropertyPlaceholderAutoConfiguration.class)

注释在上下文中包含PropertySourcesPlaceholderConfigurer(如果它不存在)。