我有以下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个实例的内容?
或者我是否有设计问题,我应该采用不同的方式设置?
答案 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;