有没有办法在Spring XML中指定默认属性值?

时间:2010-03-25 06:26:49

标签: java xml spring properties

我们使用 PropertyPlaceholderConfigurer 在Spring配置中使用java属性(details here

例如:

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

我们想添加一个额外的属性,但是有一个分布式系统,其中现有实例都可以使用默认值。有没有办法避免更新我们的所有属性文件,通过在没有定义覆盖属性值的情况下指示Spring配置中的默认值?

7 个答案:

答案 0 :(得分:262)

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

答案 1 :(得分:25)

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

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}

答案 2 :(得分:21)

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

应该让你有8088作为默认端口

另见: http://blog.callistaenterprise.se/2011/11/17/configure-your-spring-web-application/

答案 3 :(得分:14)

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

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

  

PropertyOverrideConfigurer,   另一家豆厂后处理器,   类似于   PropertyPlaceholderConfigurer,但在   与后者形成鲜明对比的是原作   定义可以有默认值或   对于bean属性没有任何值。   如果重写属性文件   没有某个bean的条目   property,默认上下文   定义被使用。

答案 4 :(得分: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> 

答案 5 :(得分:8)

使用?:,即Elvis Operator

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

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

它是三元运算符的简写,availableSpring 3.0以来,与the same operator in Groovy有连接。

答案 6 :(得分: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

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