Мы используем PropertyPlaceholderConfigurer для использования свойств java в нашей конфигурации Spring ( подробности здесь )
например:
<foo name="port">
<value>${my.server.port}</value>
</foo>
Мы хотели бы добавить дополнительное свойство, но иметь распределенную систему, в которой все существующие экземпляры могут использовать значение по умолчанию. Есть ли способ избежать обновления всех наших файлов свойств, указав значение по умолчанию в конфигурации Spring, когда не определено значение переопределяющего свойства?
источник
18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA
такое? Я уверен, что все знают, и я просто глуп, но на всякий случай ...Spring 3 поддерживает
${my.server.port:defaultValue}
синтаксис.источник
${my.server.port:-defaultValue}
также дает тот же результат, обратите внимание на ":-
" вместо ":
".<context:property-placeholder/>
чтобы это работало, или добавитьPropertyPlaceholderConfigurer
Есть малоизвестная функция, которая делает это еще лучше. Вы можете использовать настраиваемое значение по умолчанию вместо жестко запрограммированного, вот пример:
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}}
. Это позволило мне по умолчанию также быть переменной.<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}" />
Или в java-коде:
@Value("${my.server.port:8080}") private String myServerPort;
Увидеть:
valueSeparator
(изAbstractPropertyResolver
)и
VALUE_SEPARATOR
(изSystemPropertyUtils
)Кстати, оператор Элвиса доступен только в Spring Expression Language (SpEL),
например: https://stackoverflow.com/a/37706167/537554
источник
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
Для меня это было настоящим открытием.
источник