我正在使用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访问该环境变量。我尝试过以下方法:
以上所有都返回null。很高兴看到一个如何在Spring中使用纯Java配置访问环境变量的工作示例。
感谢您的帮助。
答案 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?