我想在 Spring 的 applicationContext.xml 中访问一些从 JVM 传递的属性值。我知道实现这一点的一种方法是#{systemProperties.myProperty}
根据-DmyProperty=xyz
Spring 的表达式语言功能。
但是我有兴趣为我通过 JVM 分配的每个此类属性设置一个默认值,以防用户没有从服务器的 JVM 选项中设置值。如何在 Spring 的任何上下文 xml 文件中实现这一点?请帮忙。
我想在 Spring 的 applicationContext.xml 中访问一些从 JVM 传递的属性值。我知道实现这一点的一种方法是#{systemProperties.myProperty}
根据-DmyProperty=xyz
Spring 的表达式语言功能。
但是我有兴趣为我通过 JVM 分配的每个此类属性设置一个默认值,以防用户没有从服务器的 JVM 选项中设置值。如何在 Spring 的任何上下文 xml 文件中实现这一点?请帮忙。
您可以制作一个 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" />
在 Spring EL 中,您可以添加一个默认值。在你的情况下:
#{systemProperties.myProperty:MyDefaultValue}
使用基于注释的配置,您可以使用 Elvis Operator 在 Spring EL 中提供默认值:
@Value("#{systemProperties['hostname'] ?: 'default-hostname'}")
private String hostname;
基于 atrain 的有用答案。我还不能发表评论,或者我会把语法更正放在那里:(