使用Spring引用PropertiesConfiguration的文件

时间:2012-02-10 08:16:10

标签: java apache spring jboss apache-commons-config

我的应用程序运行在Jboss 4.2.2 GA上,Spring 2.5.6,Richfaces 3.1.6.SR1,JSF 1.1_02。 我想要的是在我耳边有一个porpertie文件,其中包含s.th.喜欢

  • 信息1 = “乔伊”
  • 信息2 = “迪迪”
  • information3 = “Marky”
  • [...]

此文件的更改应立即产生影响。 我开始是这样的:

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;

[...]

PropertiesConfiguration configure = null;
{
try {
        configure = new PropertiesConfiguration("myProperties.properties");
        configure.setReloadingStrategy(new FileChangedReloadingStrategy());
        configure.setAutoSave(true);

    } catch (ConfigurationException e) {
        e.printStackTrace();
    }
}

这似乎只有在myProperties.properties位于我耳内的目标目录中的某个位置时才有效。所以我改变了我的代码:

File file = new File(myAppRoot + FSEP + "appserver" + FSEP + "server" + FSEP +   "default"
                                + FSEP + "conf" + FSEP + "myApp" + FSEP + "myProperties.properties");
configure = new PropertiesConfiguration(file);
configure.setReloadingStrategy(new FileChangedReloadingStrategy());
configure.setAutoSave(true);

这很好用。但我想避免使用绝对路径。我已经定义了一个

<bean id="myPropertyConfigurer"    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
[...]
<property name="locations">
  <list>
    <value>classpath:myProperties.properties</value>
    <value>classpath:myApp/myProperties.properties</value>
  </list>
</property>

1 个答案:

答案 0 :(得分:0)

您可以向启动程序的java添加一些-D选项。例如:

java ... -DjdbcPropsLocation=%YOUR_PROPERTIES_LOCATION% -DcustomInternalPropsLocation=%SOME_OTHER_PROPS_FILE_LOCATION% ...

然后在您的应用程序上下文中使用此选项,如下所示: (注意存储在文件internal.properties中的属性通过使用上次重载获胜的不同位置而被重载,因此顺序很重要。)

    <bean id="propsLocations" class="java.util.ArrayList" >
    <constructor-arg>
        <list>
            <value>classpath:jdbc.properties</value>
            <value>${jdbcPropsLocation}\jdbc.properties</value>
            <!-- loading the default internal properties -->
            <value>classpath:internal.properties</value>
            <!-- loading the meta-data.properties -->
            <value>classpath:meta-data.properties</value>
            <!-- overloading the internal properties with custom values -->
            <value>${customInternalPropsLocation}\internal.properties</value>
        </list>
    </constructor-arg>
</bean>


<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" >
        <list>
            <!-- <value>classpath:${jdbcPropsLocation}/jdbc.properties</value> -->
            <value>classpath:jdbc.properties</value>
            <value>${jdbcPropsLocation}\jdbc.properties</value>
            <!-- loading the default internal properties -->
            <value>classpath:internal.properties</value>
            <!-- loading the meta-data.properties -->
            <value>classpath:meta-data.properties</value>
            <!-- overloading the internal properties with custom values -->
            <value>${customInternalPropsLocation}\internal.properties</value>
        </list>
    </property>
</bean>

或者,您可以在加载使用属性的应用程序上下文之前从代码中设置系统属性(-D):

System.setProperty(CUSTOM_INTERNAL_PROPS_LOCATION_PROP_KEY, CUSTOM_INTERNAL_PROPS_LOCATION_PROP_VAL);