我可以为Spring FileSystemResource使用基于环境变量的位置吗?

时间:2009-12-03 18:22:01

标签: java spring

我要求将所有属性文件存储在目录中。该目录的位置应存储在系统环境变量中。在我的应用程序上下文中,我将需要访问此环境变量来创建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

5 个答案:

答案 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变量配置的部署位置。配置程序按顺序处理这些(即部署优先于默认值)。

OLD

我最终采用非程序化方法。我使用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>