0

我有一个用例,我不能使用 Qualifier 注释(至少根据我的理解),但我仍然需要在 Autowire 的两个 bean 之间进行解析。我不能使用限定符,因为我不知道 FooBar 的哪个实现将在 Foo 类中使用。这是我的设置:

class Foo
{
    @Autowired
    private FooBar a;
    public Foo(FooBar aa) {a = aa; }
}

interface FooBar
{}

class FooBarA implements FooBar
{}

class FooBarB implements FooBar
{}

弹簧配置:

<bean id="beanA" class="FooBarA"/>
<bean id="beanB" class="FooBarB"/>

<bean id="bean1" class="Foo">
    <constructor-arg><ref bean="beanA"/></constructor-arg>
</bean>

<bean id="bean2" class="Foo">
    <constructor-arg><ref bean="beanB"/></constructor-arg>
</bean>

这会引发一个错误,指出它无法解析类“Foo”中变量“a”的 bean,因为有两个 bean(beanA 和 beanB),即使我已明确指定在 bean1 和 bean2 的每种情况下使用哪个 FooBar 派生.

4

1 回答 1

1

我相信构造函数注入应该是这样的:

<constructor-arg>
    <ref bean="beanA"/>
</constructor-arg>

甚至只是

<constructor-arg ref="beanA" />

由于您使用的是构造函数注入,因此@Autowired还将注释从FooBarin移动到构造函数。Foo

或者,您可以通过执行以下操作来使用字段注入:

<bean id="bean1" class="Foo">
    <property name="a" ref="beanA" />
</bean>
于 2012-07-26T01:24:59.600 回答