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

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

например:

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

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

6 ответов

Решение

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

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html

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

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

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

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}
<foo name="port">
   <value>${my.server.port:8088}</value>
</foo>

должно работать для вас, чтобы 8088 порт по умолчанию

Смотрите также: http://blog.callistaenterprise.se/2011/11/17/configure-your-spring-web-application/

Использование ?:а именно Элвис Оператор:

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

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

Это сокращение для троичного оператора, доступное начиная с Spring 3.0 и имеющее соединение с тем же оператором в Groovy.

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html указывает, что "локальные свойства", определенные в самом бине, будут считаться значениями по умолчанию, которые будут переопределены значениями, считанными из файлов:

<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> 

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

<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

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

Другие вопросы по тегам