我想外部化我计划使用的配置属性 - PropertyPlaceholderconfigurer - 这是我的上下文文件:
<bean id="helloBean" class="com.springex1.HelloWorld">
<property name="name" value="test!{my.db.jdbc.driver}" />
</bean>
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="testPropertyConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="location" value="classpath:/springdb.properties"/>
<property name="placeholderPrefix" value="test!{"/>
<property name="placeholderSuffix" value="}"/>
<property name="order" value="0"/>
</bean>
简单的java类 - HelloWorld.java
public class HelloWorld {
private String name;
public void setName(String name) {
this.name = name;
}
public void printHello() {
System.out.println("Hello ! " + name);
}
我的属性文件:
my.db.jdbc.driver=xyz
foo=bar
所有这一切都很好。请注意,第一个属性正在注入
my.db.jdbc.driver = XYZ
而第二个属性
富=酒吧
没有被使用 - 但春天工作正常并且没有抱怨
现在我决定覆盖属性 - 所以决定添加propertyOverrideConfigurer
<bean id="propertyOverrideConfigurer"
class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<property name="location" value="classpath:/override.properties" />
<property name="order" value="20" />
</bean>
添加了override.properties:
helloBean.name = oracle.jdbc.OracleDriver
这可以按预期工作并打印 - oracle.jdbc.OracleDriver
现在我的理解是我想覆盖附加属性
富=巴兹
然后代码失败:
线程“main”中的异常org.springframework.beans.factory.BeanInitializationException:无法在PropertyOverrideConfigurer中处理键'foo';嵌套异常是org.springframework.beans.factory.BeanInitializationException:无效的键'foo':期望'beanName.property'
这部分是可以理解的 - spring正在寻找bean名称'helloBean',然后是相应的属性。
虽然这个问题被理解了 - 我的问题是 - 在PropertyPlaceholderConfigurer中,我可以定义未注入的其他属性,并且它可以正常工作。 但是 - PropertyOverrideConfigurer - 定义的任何属性必须被注入并且为此发生 - 必须有一个可用属性的bean
在PropertyOverrideConfigurer的情况下,我真的没有其他属性 - 这听起来不对。
我错过了可以忽略此错误的内容吗?