Spring中除限定符注释之外的解决方案

时间:2012-07-26 01:16:04

标签: spring

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

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

interface FooBar
{}

class FooBarA implements FooBar
{}

class FooBarB implements FooBar
{}

spring config:

<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),即使我已明确指定在每种情况下使用哪个FooBar派生bean1和bean2。

1 个答案:

答案 0 :(得分:1)

我相信构造函数注入应该如下所示:

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

甚至只是

<constructor-arg ref="beanA" />

同样将@Autowired注释从FooBar中的Foo移到构造函数中,因为您正在使用构造函数注入。

或者,你可以这样做:

<bean id="bean1" class="Foo">
    <property name="a" ref="beanA" />
</bean>