小编典典

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

java

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


阅读 213

收藏
2020-09-16

共1个答案

小编典典

更新

后来我们升级到了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>
2020-09-16