春天&没有类型的独特豆

时间:2013-12-20 12:53:16

标签: java spring autowired

我有以下Beans for Spring单元测试:

abstract class A {
    // some injections using @Value
}

class B extends A {
    // some injections using @Autowired, @Qualifier, @PersistenceUnit and @Value
}

class C extends A {
    // some injections using @Autowired, @Qualifier, @PersistenceUnit and @Value
}

class Foo{

    @Autowired
    private A a;

    ...
}

class BarTest{

    @Autowired
    private B b;

    @Autowired
    private C c;

    @Autowired // Expected: fooB.a = b
    private Foo fooB;

    @Autowired // Expected: fooC.a = c
    private Foo fooC;

    ...
}

在BarTest类中:是否可以控制注入Foo的2个实例的内容?

或者我是否有设计问题,我应该采用不同的方式设置?

3 个答案:

答案 0 :(得分:1)

您可以通过限定符控制注入的内容。

但在这种情况下,您的Foo课程不会是单身人士。因此,您很可能必须通过XML实例化(至少 - 根据您的需要)两个Foo对象。

像这样:

<beans ... >
    <bean id="b" class="your.pack.B" >
    <bean id="c" class="your.pack.C" >
    <bean id="fooB" class="your.pack.Foo" >
        <property name="a" ref="b" />
    </bean>
    <bean id="fooC" class="your.pack.Foo" >
        <property name="a" ref="c" />
    </bean>

...
</beans>

-

@Autowired // Expected: fooB.a = b
@Qualifier("fooB")
private Foo fooB;

@Autowired // Expected: fooB.a = c
@Qualifier("fooC")
private Foo fooC;

(并删除@Autowired类中的Foo注释)

答案 1 :(得分:1)

作为@Qualifier的替代方案,您可以使用javax.annotation.Resource注释

@Resource(name = "fooB")
private Foo fooB;

@Resource(name = "fooC")
private Foo fooC;

答案 2 :(得分:0)

您需要指定@Qualifier

@Qualifier("C")
@Autowired
private C c;

@Qualifier("B")
@Autowired
private B b;