【问题标题】:A solution other than the Qualifier annotation in SpringSpring中Qualifier注解以外的解决方案
【发布时间】:2012-07-24 13:12:34
【问题描述】:

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

【问题讨论】:

  • 您是故意排除您的Foo 构造函数,还是试图将一个bean 注入到一个不存在的构造函数中?
  • 错过了构造函数。但是构造函数在原始代码中。

标签: spring


【解决方案1】:

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

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

甚至只是

<constructor-arg ref="beanA" />

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

或者,您可以通过这样做来使用字段注入:

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

【讨论】:

  • 我可以在哪里使用限定符?我不能在 Foo 类中使用限定符,因为我不知道将使用 FooBar 的哪个实现。
  • 我错过了bean这个词,这是写帖子时的错字。它存在于原始代码中。
  • 没关系,我没有正确阅读问题。一个限定符是行不通的。尝试使用我上面显示的构造函数注入并删除注释。
  • 从 FooBar 中删除了 Autowired 注释,它起作用了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2020-03-21
  • 2013-07-22
  • 1970-01-01
  • 2012-03-31
  • 2018-02-07
  • 1970-01-01
相关资源
最近更新 更多