根据Spring documentation on PropertyOverrideConfigurer,您无法使用属性覆盖配置器机制覆盖bean引用。也就是说,您只能提供文字值:
始终指定覆盖值 字面值;他们不是 翻译成bean引用。这个 惯例也适用于 XML bean中的原始值 definition指定bean引用。
如果我仍想使用覆盖属性文件重新配置接线,那么解决方法是什么?
我知道我可以回过头来注入不是引用的bean而是注入它的名字。然后我可以使用属性覆盖机制覆盖有线bean名称。但该解决方案意味着依赖于Spring - ApplicationContextAware
接口及其getBean(String)
方法。还有什么更好的吗?
答案 0 :(得分:1)
正如skaffman在回答的评论中提到的,spel是您要求的解决方法。
此示例适用于我:
Dog.java
public class Dog {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}
override.properties
#person.d=#{dog1}
person.d=#{dog2}
Person.java
@Component
public class Person {
private Dog d = new Dog();
{
d.setName("buster");
}
public Dog getD() {
return d;
}
public void setD(Dog d) {
this.d = d;
}
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}
Main.java
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext c = new ClassPathXmlApplicationContext("sandbox/spring/dog/beans.xml");
System.out.println(c.getBean("person"));
}
}
的beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="sandbox.spring.dog"/>
<bean
class="org.springframework.beans.factory.config.PropertyOverrideConfigurer"
p:locations="classpath:/sandbox/spring/dog/override.properties"/>
<bean
id="dog1"
class="sandbox.spring.dog.Dog"
p:name="rover"/>
<bean
id="dog2"
class="sandbox.spring.dog.Dog"
p:name="spot"/>
</beans>
答案 1 :(得分:0)
我认为你将PropertyOverrideConfigurer
与PropertyPlaceholderConfigurer
混为一谈。这两者是相关的,非常相似,但有不同的行为,包括后者有能力做这样的事情:
<property name="myProp">
<ref bean="${x.y.z}" />
</property>
其中x.y.z
是包含bean名称的属性。
因此,您可以使用外部化属性来改变您使用PropertyPlaceholderConfigurer
的布线。
编辑:另一种方法是完全放弃XML配置,并使用@Bean
-style config in Java。这为java的表现力提供了充分的灵活性,因此你几乎可以做你喜欢的事情。