有没有一种方法可以在Spring XML中指定默认属性值?


91

我们正在使用PropertyPlaceholderConfigurer在我们的Spring配置中使用java属性(此处有详细信息

例如:

<foo name="port">
  <value>${my.server.port}</value>
</foo>

我们想添加一个附加属性,但是要有一个分布式系统,现有实例都可以使用默认值。通过在Spring config中为未定义覆盖属性值的默认值指示默认值,是否有办法避免更新所有属性文件?

Answers:


14

您是否正在寻找此处记录的PropertyOverrideConfigurer

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-overrideconfigurer

另一个bean工厂后处理程序PropertyOverrideConfigurer与PropertyPlaceholderConfigurer相似,但是与后者相反,原始定义可以具有默认值,也可以完全没有bean属性的值。如果覆盖的属性文件没有某个bean属性的条目,则使用默认的上下文定义。


有人可以向我解释什么是a 18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA吗?我确定其他所有人都知道,但我只是愚蠢,以防万一……
Sridhar Sarnobat

276

Spring 3支持${my.server.port:defaultValue}语法。


8
仅供参考:SPR-4785
古巴

11
对我而言,无论是否定义了属性,它总是使用默认值覆盖属性。
Ondrej Bozek

12
@OndrejBozek-(很抱歉改变一个旧帖子)我遇到了可能是相同的问题,请参阅Spring Framework问题[ jira.spring.io/browse/SPR-9989]。在涉及多个占位符配置器的情况下,用“:”符号指定的默认值仅由链中的第一个占位符配置器解析。因此,如果第一个配置器不具有该属性,则即使该配置链后面的配置器确实具有该属性,该属性也将始终设置为默认值。请参阅[ stackoverflow.com/a/22452984/599609]
2015年

1
似乎${my.server.port:-defaultValue}也给出了相同的结果,请注意“ :-”而不是“ :”。
上尉曼

2
您需要为此添加<context:property-placeholder/>功能,或添加PropertyPlaceholderConfigurer
shuckc

32

有一个鲜为人知的功能,这使它变得更好。您可以使用可配置的默认值,而不是硬编码的默认值,这是一个示例:

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}}。这使我的默认值也成为变量。
NewestStackOverflowUser


10

默认值后可以跟一个:属性键,例如

<property name="port" value="${my.server.port:8080}" />

或在Java代码中:

@Value("${my.server.port:8080}")
private String myServerPort;

看到:

顺便说一句,猫王运算符仅在Spring Expression Language(SpEL)中可用,
例如:https : //stackoverflow.com/a/37706167/537554


8

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,在春季的javadoc中有关于它的话,但是我不知道该怎么做!
纪尧姆

0

我也找到另一个对我有用的解决方案。在我们的旧版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

对我来说,这是一个真正的发现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.