Есть ли способ указать значение свойства по умолчанию в Spring XML?

Мы используем PropertyPlaceholderConfigurer для использования свойств java в нашей конфигурации Spring (здесь)

например:

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

Мы хотели бы добавить дополнительное свойство, но имеем распределенную систему, в которой существующие экземпляры могут использовать значение по умолчанию. Есть ли способ избежать обновления всех наших файлов свойств, указав значение по умолчанию в config Spring, если не определено значение переопределяющего свойства?

Ответ 1

Вы ищете документ PropertyOverrideConfigurer, зарегистрированный здесь.

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

Свойство PropertyOverrideConfigurer, другой bean factory постпроцессор, аналогичен PropertyPlaceholderConfigurer, но в в отличие от последнего, оригинал определения могут иметь значения по умолчанию или нет значений для свойств bean. Если переопределяющий файл свойств не имеет записи для определенного beanсвойство, контекст по умолчанию определение.

Ответ 2

Spring 3 поддерживает синтаксис ${my.server.port:defaultValue}.

Ответ 3

Существует немного известная функция, которая делает это еще лучше. Вы можете использовать настраиваемое значение по умолчанию вместо жестко закодированного, вот пример:

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}

Ответ 5

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> 

Ответ 6

Значение по умолчанию может сопровождаться : после ключа свойства, например

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

Или в коде Java:

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

Увидеть:

Кстати, оператор Элвиса доступен только в Spring Expression Language (SpEL),
например: fooobar.com/questions/12036490/...

Ответ 7

Также я нахожу другое решение, которое работает для меня. В нашем старом весеннем проекте мы используем этот метод, чтобы дать нашим пользователям возможность использовать эти собственные конфигурации:

<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

Это было настоящее открытие для меня.