我们使用 PropertyPlaceholderConfigurer 在Spring配置中使用java属性(details here)
例如:
<foo name="port">
<value>${my.server.port}</value>
</foo>
我们想添加一个额外的属性,但是有一个分布式系统,其中现有实例都可以使用默认值。有没有办法避免更新我们的所有属性文件,通过在没有定义覆盖属性值的情况下指示Spring配置中的默认值?
答案 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
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}" />
它是三元运算符的简写,available自Spring 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
对我来说这是一个真正的发现。