我要求将所有属性文件存储在目录中。该目录的位置应存储在系统环境变量中。在我的应用程序上下文中,我将需要访问此环境变量来创建FileSystemResource bean。以下是我通常会拥有的一个例子:
<bean id="properties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<bean class="org.springframework.core.io.FileSystemResource">
<constructor-arg>
<value>myprops.properties</value>
</constructor-arg>
</bean>
</property>
</bean>
相反,我需要让它像
<value>${prop_file_location}/myprops.properties</value>
其中prop文件位置是环境变量。有谁知道这样做的简单方法?
我使用的是spring 2.5.6和java 1.6
答案 0 :(得分:14)
我们后来升级到Spring 3.0.X并且我们能够利用spring表达式语言。我们的方法从三个bean简化为以下代码段:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:defaults.properties</value>
<value>file:/a/defined/location/project.properties</value>
<value>file:${AN_ENV_CONFIGURED_DIR}/project.properties</value>
</list>
</property>
<property name="ignoreResourceNotFound" value="true" />
<property name="searchSystemEnvironment" value="true" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>
这允许我们拥有一个开发(第一个默认值)静态知名位置,或者通过env变量配置的部署位置。配置程序按顺序处理这些(即部署优先于默认值)。
我最终采用非程序化方法。我使用MethodInvoker来检索环境值。然后我能够将其传递给FileSystemResource。
<bean id="configPath" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" >
<property name="targetClass" value="java.lang.String" />
<property name="staticMethod" value="java.lang.System.getenv" />
<property name="arguments">
<list>
<value>NAME_OF_VARIABLE</value>
</list>
</property>
</bean>
答案 1 :(得分:4)
虽然我注意到这个问题需要2.5.x,但值得指出的是,Spring 3的EL支持(自2009年11月起可用)将会做出这类事情的简短工作
@Value("#{ systemProperties['user.home'] }")
private String userHome ;
或
<property name = "userHome" value ="#{ systemProperties['user.home'] }"/>
答案 2 :(得分:1)
你总是可以通过将属性文件位置系统属性添加到文件路径来扩展FileSystemResource(即PropertiesFileResource)来初始化自己。
答案 3 :(得分:1)
在Spring.Net中,我们有IVariableSource接口和PropertyPlaceholderConfigurer,它们能够从环境变量中检索值。也许Spring Framework for Java中有类似的东西?
编辑:我想想我找到了相应的java bean,名为PropertyPlaceholderConfigurer以及in the java docs。
答案 4 :(得分:0)
示例:
使用-DDA_HOME = c:\ temp
启动应用程序c:\ temp必须包含名为“config”的目录
在c:\ temp \ config中,您有文件app.properties(例如)
扩展Spring加载器:
public class Loader extends org.springframework.beans.factory.config.PropertyPlaceholderConfigurer{
private String appHome;
public void setAppHome(String appHome) {
this.appHome = appHome;
}
@Override
public void setLocation(Resource location) {
if(appHome==null){
throw new RuntimeException("You must specify VM property DA_HOME, this directory must contain " +
"another directory, called config, inside the config directory app.properties " +
"file must be found with the configuration properties");
}
String configurationDirectory = appHome + System.getProperty("file.separator") + "config";
String fileName = location.getFilename();
Resource file = new FileSystemResource( configurationDirectory + System.getProperty("file.separator")+ fileName);
super.setLocation(file);
}
}
指定新加载程序及其配置库:
<bean id="placeholderConfig" class="your.Loader">
<property name="appHome" value="#{systemProperties['DA_HOME']}"/>
<property name="location" value="app.properties" />
</bean>