Answers:
您是否正在寻找此处记录的PropertyOverrideConfigurer
另一个bean工厂后处理程序PropertyOverrideConfigurer与PropertyPlaceholderConfigurer相似,但是与后者相反,原始定义可以具有默认值,也可以完全没有bean属性的值。如果覆盖的属性文件没有某个bean属性的条目,则使用默认的上下文定义。
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本身上定义的“本地属性”将被视为默认值,这些默认值将被从文件读取的值覆盖:
<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>
我也找到另一个对我有用的解决方案。在我们的旧版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
对我来说,这是一个真正的发现。
18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA
吗?我确定其他所有人都知道,但我只是愚蠢,以防万一……