【发布时间】:2014-12-01 21:39:36
【问题描述】:
我正在使用带有纯 Java 配置(无 xml)的 Spring 编写一个 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 上的系统属性(即终端输出 localhost 中的 echo $env)
我似乎无法弄清楚如何使用纯 Java 访问该环境变量。我尝试了以下方法:
- 如上代码所示使用 Spring 环境。
- @Value("#{ systemEnvironment['env'] }") 获取新变量并将其作为字符串访问
- @Value("#{ systemProperties['env'] }") 用于新变量并将其作为字符串访问
- @Value("${env}") 用于新变量并将其作为字符串访问
以上所有都返回null。很高兴看到如何在 Spring 中使用纯 Java 配置访问环境变量的工作示例。
感谢您的帮助。
【问题讨论】:
-
是位于 shift-local.properties 文件中的 'env' 属性,或者您只是尝试使用 @Value("${env}") 在字符串字段中获取 'local'?
-
我正在尝试在字符串字段中获取“本地”。然后该字符串将构成我的环境特定属性文件名的一部分。 'env' 是传入的变量名。
标签: java spring spring-mvc environment-variables