4

我想在 Spring 的 applicationContext.xml 中访问一些从 JVM 传递的属性值。我知道实现这一点的一种方法是#{systemProperties.myProperty}根据-DmyProperty=xyzSpring 的表达式语言功能。

但是我有兴趣为我通过 JVM 分配的每个此类属性设置一个默认值,以防用户没有从服务器的 JVM 选项中设置值。如何在 Spring 的任何上下文 xml 文件中实现这一点?请帮忙。

4

3 回答 3

3

您可以制作一个 bean,它从具有默认值的上下文中获取地图参数并初始化系统属性

<bean class="test.B1">
    <constructor-arg>
        <map>
            <entry key="p1" value="v1" />
            <entry key="p2" value="v2" />
                                 ....
        </map>
    </constructor-arg>
</bean>

.

public B1(Map<String, String> defaultProperties) {
    for (Map.Entry<String, String> e : defaultProperties.entrySet()) {
        if (System.getProperty(e.getKey()) == null) {
            System.setProperty(e.getKey()
                    , e.getValue());
        }
    }
}

上下文中的 B1 定义应该在任何 bean 使用之前,#{systemProperties.myProperty}以便首先初始化属性

更新

那是关于覆盖系统属性。但是如果你只需要像这里一样覆盖 Spring 占位符

<bean class="test.B1">
    <property name="prop1" value="${xxx}" />
</bean>

将属性占位符的本地覆盖属性设置为“true”就足够了

<context:property-placeholder location="classpath:/app.properties" local-override="true" />
于 2012-12-02T10:18:54.200 回答
1

在 Spring EL 中,您可以添加一个默认值。在你的情况下:

#{systemProperties.myProperty:MyDefaultValue}
于 2012-12-02T16:13:17.560 回答
1

使用基于注释的配置,您可以使用 Elvis Operator 在 Spring EL 中提供默认值:

 @Value("#{systemProperties['hostname'] ?: 'default-hostname'}")
 private String hostname;

基于 atrain 的有用答案。我还不能发表评论,或者我会把语法更正放在那里:(

于 2016-04-29T10:00:46.273 回答