继承树的依赖注入

时间:2011-08-04 17:16:22

标签: java spring dependency-injection

我正在尝试将一些属性注入父类和子类,我遇到了一些问题。我想从子进程中访问注入的commonAddress属性,但同时我想在子进程中注入相对路径。

父类:

public class Parent {
    private String commonAddress;

    public void setCommonAddress(String commonAddress) {
        this.commonAddress = commonAddress;
    }
}

儿童班:

public class Child1 extends Parent {
    private String relativePath;

    public void setRelativePath(String relativePath) {
        this.relativePath = relativePath;
    }
}

来自src / main / resources的applicationContext.xml:     

<bean id="parentBean" class="package.Parent">
    <property name="commonAddress" ref="commonAddressString"/>
</bean>

<bean id="childBean" class="package.Child1">
    <property name="relativePath" ref="relativePathString"/>
</bean>

来自src / test / resources的testApplicationContext.xml:

<bean id="commonAddressString" class="java.lang.String">
    <constructor-arg>
        <value>CommonAddressValue</value>
    </constructor-arg>
</bean>

<bean id="relativePathString" class="java.lang.String">
    <constructor-arg>
        <value>RelativePathValue</value>
    </constructor-arg>
</bean>

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/applicationContext.xml" })
public class TestParent {

    private Parent parent;

    public void setParent(Parent parent) {
        this.parent = parent;
    }

    @Test
    public void testParentInjectionInTestClass(){
        Assert.assertNotNull(parent);
    }

}

如果我使用@Autowired从TestParent注释父属性,则会出现问题,因为有2个bean符合父类型的条件。

如果我在applicationContext.xml中显式声明了测试bean,则断言失败,因此注入是不成功的。

<bean id="testParent" class="package.TestParent">
    <property name="parent" ref="parentBean"></property>
</bean>

2 个答案:

答案 0 :(得分:2)

我正在使用没有注释的直接XML Spring配置。在你的情况下,我只会指定按名称自动装配。我相信使用注释可以使用@Qualifier实现相同的效果(按名称而不是按类型连接)。

答案 1 :(得分:1)

接受的答案肯定是正确的,但您也可以考虑在spring xml文件中使用以下内容:

<context:property-placeholder location="classpath:/app.properties" />

然后假设您放置了一个具有正确名称/值对的属性文件,例如

common.address.value=some value
relative.path.value=some/path/value

你可以在spring xml中执行类似的操作:

<bean id="parentBean" class="package.Parent">
    <property name="commonAddress" value="${common.address.value}"/>
</bean>

<bean id="childBean" class="package.Child1">
    <property name="relativePath" ref="${relative.path.value}"/>
</bean>