Внедрение зависимостей для дерева наследования - PullRequest
0 голосов
/ 04 августа 2011

Я пытаюсь внедрить некоторые свойства в родительский класс и дочерний класс, и я столкнулся с некоторыми проблемами.Я хочу получить доступ к внедренному свойству 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;
    }
}

applicationContext.xml из src / main / resources:

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

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

testApplicationContext.xml из src / test / resources:

<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);
    }

}

Если я аннотирую родительское свойство из TestParent с помощью @Autowired, возникнет проблема, поскольку есть 2 компонента, подходящие для родительского типа.

Если я явно объявлю тестовый компонент в applicationContext.xml, утверждение не будет выполнено, поэтому внедрение будет неудачным.

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

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Я использую прямую конфигурацию XML Spring без аннотаций. В вашем случае я бы просто указал на autowire по имени. Я считаю, что с помощью аннотаций вы можете добиться того же эффекта (проводка по имени, а не по типу), используя @ Qualifier.

1 голос
/ 04 августа 2011

Принятый ответ, безусловно, правильный, но вы также можете рассмотреть возможность использования следующего в своем весеннем XML-файле:

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

Затем при условии, что вы поместили файл свойств с правильными парами имя / значение, например

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

Вы можете сделать что-то подобное в своей весенней 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...