有没有办法在 Spring XML 中指定默认属性值?
Posted
技术标签:
【中文标题】有没有办法在 Spring XML 中指定默认属性值?【英文标题】:Is there a way to specify a default property value in Spring XML? 【发布时间】:2011-01-31 14:12:56 【问题描述】:我们正在使用 PropertyPlaceholderConfigurer 在 Spring 配置中使用 java 属性 (details here)
例如:
<foo name="port">
<value>$my.server.port</value>
</foo>
我们想添加一个额外的属性,但有一个分布式系统,现有实例都可以使用默认值。有没有办法避免更新我们所有的属性文件,当没有定义覆盖属性值时,在 Spring 配置中指定一个默认值?
【问题讨论】:
【参考方案1】:Spring 3 支持$my.server.port:defaultValue
语法。
【讨论】:
仅供参考:SPR-4785 对我来说,无论是否定义了属性,它总是用默认值覆盖属性。 @OndrejBozek - (抱歉打了一个旧帖子)我遇到了可能是同样的问题,请参阅 Spring Framework 问题 [jira.spring.io/browse/SPR-9989]。在涉及多个占位符配置器的情况下,使用 ':' 表示法指定的默认值仅由链中的第一个占位符配置器解析。因此,如果第一个配置器没有该属性,则该属性将始终设置为默认值,即使更下游的配置器确实具有该属性。见 [***.com/a/22452984/599609] 似乎$my.server.port:-defaultValue
也给出了相同的结果,请注意“:-
”而不是“:
”。
您需要添加 <context:property-placeholder/>
才能使用此功能,或添加 PropertyPlaceholderConfigurer
【参考方案2】:
有一个鲜为人知的功能,这使它变得更好。您可以使用可配置的默认值而不是硬编码的默认值,这是一个示例:
config.properties:
timeout.default=30
timeout.myBean=60
context.xml:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>config.properties</value>
</property>
</bean>
<bean id="myBean" class="Test">
<property name="timeout" value="$timeout.myBean:$timeout.default" />
</bean>
要使用默认值,但以后仍能轻松覆盖,请在 config.properties 中执行此操作:
timeout.myBean = $timeout.default
【讨论】:
这对我有用$timeout.myBean:$timeout.default
。这允许我的默认值也成为一个变量。【参考方案3】:
<foo name="port">
<value>$my.server.port:8088</value>
</foo>
应该为您使用 8088 作为默认端口
另请参阅: http://blog.callistaenterprise.se/2011/11/17/configure-your-spring-web-application/
【讨论】:
【参考方案4】:您是否正在寻找此处记录的 PropertyOverrideConfigurer
http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-overrideconfigurer
PropertyOverrideConfigurer, 另一个豆厂后处理器, 类似于 PropertyPlaceholderConfigurer,但在 与后者相比,原来的 定义可以有默认值或 bean 属性根本没有值。 如果覆盖的属性文件 没有某个 bean 的条目 属性,默认上下文 使用定义。
【讨论】:
有人可以向我解释一下18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA
是什么吗?我敢肯定其他人都知道,我只是愚蠢,但以防万一......【参考方案5】:
默认值可以在属性键后跟:
,例如
<property name="port" value="$my.server.port:8080" />
或者在java代码中:
@Value("$my.server.port:8080")
private String myServerPort;
见:
valueSeparator
(来自AbstractPropertyResolver
)
和VALUE_SEPARATOR
(来自SystemPropertyUtils
)
顺便说一句,Elvis Operator 仅在 Spring 表达式语言 (SpEL) 中可用, 例如:https://***.com/a/37706167/537554
【讨论】:
【参考方案6】:http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html 指出在 bean 本身上定义的“本地属性”将被视为默认被从文件中读取的值覆盖:
<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location"><value>my_config.properties</value></property>
<property name="properties">
<props>
<prop key="entry.1">123</prop>
</props>
</property>
</bean>
【讨论】:
thx,在 spring javadoc 中有关于此的内容,但我不知道该怎么做!【参考方案7】:我还找到了另一个适合我的解决方案。 在我们遗留的 spring 项目中,我们使用这种方法为我们的用户提供使用这种自己的配置的可能性:
<bean id="appUserProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="ignoreResourceNotFound" value="false"/>
<property name="locations">
<list>
<value>file:./conf/user.properties</value>
</list>
</property>
</bean>
在我们的代码中访问这个属性需要写这样的东西:
@Value("#appUserProperties.userProperty")
private String userProperty
如果出现需要添加新属性但现在又不想将其添加到生产用户配置中的情况,当您需要修补所有测试上下文或应用程序将启动失败。
要处理这个问题,你可以使用下面的语法来添加一个默认值:
@Value("#appUserProperties.get('userProperty')?:'default value'")
private String userProperty
这对我来说是一个真正的发现。
【讨论】:
以上是关于有没有办法在 Spring XML 中指定默认属性值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Messaging 中指定处理程序生成的内容类型?
除了在 Spring Boot 应用程序的 bootstrap.properties 中指定之外,有没有办法为 Slueth 提供 Spring 应用程序名称?