2

我有一个使用弹簧的独立罐子。我的 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

4 回答 4

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>
于 2013-04-08T13:38:39.127 回答
1

您可以使用 aPropertyPlaceholderConfigurer来使用.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文件中获取。

于 2013-04-08T13:21:09.970 回答
0

有几个选项:

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

然后只需为每个环境使用不同的文件集

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

于 2013-04-08T13:44:28.923 回答