Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 春季及;没有类型的唯一bean_Java_Spring_Autowired - Fatal编程技术网

Java 春季及;没有类型的唯一bean

Java 春季及;没有类型的唯一bean,java,spring,autowired,Java,Spring,Autowired,我有以下用于基于Spring的单元测试的bean: 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, @

我有以下用于基于Spring的单元测试的bean:

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实例中的内容吗

还是我有设计问题,我应该以不同的方式进行设置?

您需要指定


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

但是在这种情况下,您的
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>

(并且去掉
Foo
类中的
@Autowired
注释)

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

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

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

可能重复@nobeh不,我认为这是一个不同的问题。这里不需要c和b的限定符,因为b和c只有一种类型。问题在于Foo。是的,这就是我所担心的。但在这种情况下,我可以在BarTest(JUnit test)类的setup/@Before方法中以编程方式设置Foo.a,并省略@Autowired注释和XML配置。这里的问题不是注入B,而是Foo.a(两个不同的实例)。为什么在这里推荐Resource而不是Qualifier?
@Autowired // Expected: fooB.a = b
@Qualifier("fooB")
private Foo fooB;

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

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