java – 具有PropertyPlaceholderConfigurer bean的Spring @Configuration文件不会解析@Value注释

我有以下配置文件:

@Configuration
public class PropertyPlaceholderConfigurerConfig {

    @Value("${property:defaultValue}")
    private String property;

    @Bean
    public static PropertyPlaceholderConfigurer ppc() throws IOException {
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        ppc.setLocations(new ClassPathResource("properties/" + property + ".properties"));
        ppc.setIgnoreUnresolvablePlaceholders(true);
        return ppc;
    }
}

我运行我的应用程序与以下VM选项:

-Dproperty=propertyValue

所以我希望我的应用程序在启动时加载特定的属性文件。但是由于某些原因,在这个阶段,@Value注释不会被处理,而属性为null。另一方面,如果我通过xml文件配置PropertyPlaceholderConfigurer – 一切都按预期完成。 Xml文件示例:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="location">
        <value>classpath:properties/${property:defaultValue}.properties</value>
    </property>
</bean>

如果我尝试在另一个Spring配置文件中注入属性值 – 它被正确地注入。如果我将PropertyPlaceholderConfigurer bean创建移动到该配置文件 – 域值再次为null。

作为解决方法,我使用这一行代码:

System.getProperties().getProperty("property", "defaultValue")

哪个也是有用的,但我想知道为什么会发生这种行为,也可能以其他方式重写它,但是没有xml?

从春JavaDoc

In order to resolve ${…} placeholders in definitions or @Value annotations using properties from a PropertySource, one must register a PropertySourcesPlaceholderConfigurer. This happens automatically when using in XML, but must be explicitly registered using a static @Bean method when using @Configuration classes. See the “Working with externalized values” section of @Configuration’s javadoc and “a note on BeanFactoryPostProcessor-returning @Bean methods” of @Bean’s javadoc for details and examples.

因此,您正在尝试在占位符处理所需的代码块中使用占位符。

如@ M.Deinum所述,您应该使用PropertySource(默认或自定义实现)。

下面的例子显示了如何使用PropertySource注释中的属性以及如何从一个字段中的PropertySource注入属性。

@Configuration
@PropertySource(
          value={"classpath:properties/${property:defaultValue}.properties"},
          ignoreResourceNotFound = true)
public class ConfigExample {

    @Value("${propertyNameFromFile:defaultValue}")
    String propertyToBeInjected;

    /**
     * Property placeholder configurer needed to process @Value annotations
     */
     @Bean
     public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
     }
}
翻译自:https://stackoverflow.com/questions/33344895/spring-configuration-file-with-propertyplaceholderconfigurer-bean-doesnt-resol

转载注明原文:java – 具有PropertyPlaceholderConfigurer bean的Spring @Configuration文件不会解析@Value注释