7

我以前使用现在已弃用的类org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer从服务器的文件系统加载属性文件。我定义了以下bean:

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="locations" value="${config}"/>
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="searchContextAttributes" value="true"/>
    <property name="contextOverride" value="false"/>
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="searchSystemEnvironment" value="false"/>
</bean>

是启动Tomcat时传递的config参数,即

-Dconfig=/path/to/application.properties

对于 webapp,我还有一个上下文文件:

<Context docBase="/path/to/application.war">
    <Parameter name="host" value="localhost" override="false"/>
    <Parameter name="port" value="8080" override="false"/>
</Context>

如果参数.properties指定的文件-Dconfig包含一些其他 bean 引用的属性,.properties则使用文件中的值,否则使用上下文 xml 文件中的值。

这允许我使用 WAR 部署一组默认属性,如果需要,我可以指定一个.properties文件来覆盖特定值。

现在,我正在更新以使用 Spring 3.1 中的新属性抽象,但我似乎无法弄清楚与之等效的方法是什么?

我以相同的方式部署了相同的上下文文件和战争,现在我在应用程序中有以下内容:

<context:property-placeholder
        location="${config}"
        system-properties-mode="OVERRIDE"
        ignore-resource-not-found="true"
        ignore-unresolvable="true"/>

这会查找并使用属性文件中的属性,但它不使用上下文 XML 文件中的值。

使用这个新的属性占位符时,如何让我的应用程序使用上下文参数?

谢谢。

4

2 回答 2

4

总结问题是,当使用 Spring 3.1 中引入的新 Property Placeholder 命名空间时,servlet 上下文文件中的上下文参数没有被用于解析占位符。

我想出了一个解决方案,如下

<context:property-placeholder location="${config}" local-override="true" ignore-resource-not-found="true"/>

我可以使用 JVM arg 在本地文件系统上指定一个或多个 *.properties 文件,例如:

-Dconfig=/path/app.properties

如果在检查文件后无法解析占位符属性,则检查app.propertiesServlet 上下文参数。

这允许我使用 web.xml 中的上下文参数来获得默认值,并且我可以通过使用configJVM arg 指定 *.properties 文件的位置来覆盖这些值。

让它以这种方式工作的关键是包含local-override="true",默认情况下为 false。我不完全确定它是否有意义,因为该属性的描述是:

指定本地属性是否覆盖文件中的属性。默认值为“false”:文件中的属性覆盖本地默认值。

如果 中存在相同的属性键app.properties并且使用web.xml来自 的值app.properties

于 2013-07-16T09:39:33.730 回答
1

除非定义了基于用户的属性文件,否则 Spring 使用默认属性文件。如果您想控制 .properties 文件,请按照此处发布的说明进行操作。

如果您想利用 application.properties 有两种方法可以做到这一点。

<!-- allows for ${} replacement in the spring xml configuration from the 
    system.properties file on the classpath -->
<util:properties id="appProperties" location="classpath:application.properties"/>
<context:property-placeholder location="classpath:application.properties"/>

util 标记允许您使用 Property 类来读取整个应用程序的属性。例如:

@Autowired
public MyPropertyReader(Properties appProperties) {
    String prop1 =  appProperties.getProperty("my.address");
    String prop2 =  appProperties.getProperty("my.version");
}

如果要使用上下文文件中的值,请使用 context:property-placeholder 标记。然后你可以使用你的价值观

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" p:brokerURL="${jms.primary.server}"/>

例如 jms.primary.server=172.168.10.18:6161 在 application.properties 中。

于 2013-07-15T05:41:11.057 回答