使用PropertyOverrrideConfigurer覆盖bean引用

时间:2011-01-26 08:22:49

标签: java spring

根据Spring documentation on PropertyOverrideConfigurer,您无法使用属性覆盖配置器机制覆盖bean引用。也就是说,您只能提供文字值:

  

始终指定覆盖值   字面值;他们不是   翻译成bean引用。这个   惯例也适用于   XML bean中的原始值   definition指定bean引用。

如果我仍想使用覆盖属性文件重新配置接线,那么解决方法是什么?

我知道我可以回过头来注入不是引用的bean而是注入它的名字。然后我可以使用属性覆盖机制覆盖有线bean名称。但该解决方案意味着依赖于Spring - ApplicationContextAware接口及其getBean(String)方法。还有什么更好的吗?

2 个答案:

答案 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)

我认为你将PropertyOverrideConfigurerPropertyPlaceholderConfigurer混为一谈。这两者是相关的,非常相似,但有不同的行为,包括后者有能力做这样的事情:

<property name="myProp">
   <ref bean="${x.y.z}" />
</property>

其中x.y.z是包含bean名称的属性。

因此,您可以使用外部化属性来改变您使用PropertyPlaceholderConfigurer的布线。

编辑:另一种方法是完全放弃XML配置,并使用@Bean-style config in Java。这为java的表现力提供了充分的灵活性,因此你几乎可以做你喜欢的事情。