使用纯spring java配置访问环境属性

时间:2014-10-07 12:47:16

标签: java spring spring-mvc environment-variables

我正在使用Spring编写一个带有纯Java配置(无xml)的Web应用程序。我想要一个解决方案,根据我的应用程序运行位置(dev / test / prod)公开各种特定于环境的属性。通过xml使用Spring xml配置和PropertyPlaceholderConfigurer,我会做这样的事情:

<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <value>classpath:shift.properties</value>
            <value>classpath:shift-${env}.properties</value>
        </list>
    </property>
</bean>

在Java配置中,我要做的是以下内容:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.values.shift" })
public class WebConfig extends WebMvcConfigurerAdapter {

@Autowired
private static Environment springEnv;

@Bean
public static PropertyPlaceholderConfigurer propertyConfigurer() throws IOException {
    PropertyPlaceholderConfigurer props = new PropertyPlaceholderConfigurer();
    System.out.println("Environment:" + env.toString());
    props.setLocations(
            new Resource[] {
                    new ClassPathResource("shift.properties"), 
                    new ClassPathResource("shift-" + springEnv.getProperty("env") + ".properties")}
            );
    props.setIgnoreResourceNotFound(true);
    return props;
}

我将-Denv = localhost设置为Tomcat上的VM参数。我也将它设置为我的mac上的系统属性(即终端中的echo $ env输出localhost)

我似乎无法弄清楚如何使用纯Java访问该环境变量。我尝试过以下方法:

  • 使用Spring Environment,如上面的代码所示。
  • @Value(“#{systemEnvironment ['env']}”)获取新变量并将其作为字符串访问
  • @Value(“#{systemProperties ['env']}”)获取新变量并将其作为字符串访问
  • @Value(“$ {env}”)获取新变量并将其作为字符串访问

以上所有都返回null。很高兴看到一个如何在Spring中使用纯Java配置访问环境变量的工作示例。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

它现在尝试在属性文件中找到'env'属性。

您错过了在PropertyPlaceholderConfigurer上使用systemPropertiesModeName方法,这将使您的@Value(“#{systemProperties ['env']}”)有效。

//编辑:

不要在静态字段上使用@Autowired。

//编辑2:

这就是我正在使用的:

@Configuration
public class PropertiesConfig {

@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return PropertyLoadHelper.getPropertySourcesPlaceholderConfigurer();
}

public static class PropertyLoadHelper {
    public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() {
        PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
        properties.setLocations(new ClassPathResource[]{
                new ClassPathResource("config/app." + System.getenv("ENV") + "properties"),
                new ClassPathResource("config/local.app." + System.getenv("ENV") + "properties"),
                new ClassPathResource("config/application.properties")
        });
        properties.setBeanName("app");
        properties.setLocalOverride(true);
        properties.setIgnoreResourceNotFound(true);
        return properties;
    }


    public static Properties loadProperties(String propertiesPath) {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource(propertiesPath));
        Properties properties = null;
        try {
            propertiesFactoryBean.afterPropertiesSet();
            properties = propertiesFactoryBean.getObject();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return properties;
    }

}

}

差异: 使用了PropertySourcesPlaceholderConfigurer,而System.getenv则使用了Autowired Environment。在设置PropertyPlaceHolder bean之前可能无法使用Environment?