是否可以在运行时指定上下文属性占位符

时间:2013-04-08 13:16:19

标签: java spring properties

我有一个使用弹簧的独立罐子。我的spring xml中的配置使用了在使用maven编译时我一直在替换的占位符。弹簧配置示例:

<bean id="foo" class="package.Foo">
    <property name="host" value="${db.host}" />
</bean>

我没有使用maven替换${db.host},而是想在运行时传入属性文件,例如

java -jar Application.jar productionDB.properties

这将允许我通过传入生产数据库属性文件或测试数据库属性文件来在运行时切换数据库主机。

是否可以这样做或有更好的方法来实现同一目标吗?

4 个答案:

答案 0 :(得分:3)

您可以将属性文件指定为系统属性,例如:

java -jar Application.jar -DappConfig=/path/to/productionDB.properties

然后你应该能够在你的应用程序环境中引用它:

<context:property-placeholder location="file:${appConfig}"/>

<bean id="foo" class="package.Foo">
    <property name="host" value="${db.host}" />
</bean>

答案 1 :(得分:1)

您可以使用PropertyPlaceholderConfigurer使用.properties文件传递所需的变量。

<bean id="placeholderConfig"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:productionDB.properties</value>
        </list>
    </property>
</bean>

您可以按原样保留bean声明。这些属性将自动从productionDB.properties文件中获取。

答案 2 :(得分:0)

有几个选择:

  1. 通过容器的JNDI设置资源,并使用Spring的<jee:jndi-lookup/>
  2. 使用Spring的<context:property-placeholder location="classpath:/myProps.properties" />。我更喜欢这个“完整”bean定义的简写,因为Spring会自动使用正确的实现(PropertyPlaceholderConfigurer用于Spring&lt; 3.1,或PropertySourcesPlaceholderConfigurer用于Spring 3.1+)。使用此配置,您只需将myProps.properties放在类路径的根目录(例如${TOMCAT_HOME}/lib)。

答案 3 :(得分:0)

您可以使用context:property-placeholder传递值。所以你的设置会是这样的:

<context:property-placeholder location="file://opt/db.properties"/>

然后,当您连接Foo服务时,可以使用配置中的属性名称,例如

<bean id="foo" class="package.Foo">
   <property name="host" value="${db.host}" />
</bean>

然后只为每个environmnet使用不同的文件集

有关详细信息,请参阅spring文档。