不能将@Qualifier与@Inject和autowire =“byType”一起使用

时间:2012-11-02 15:56:32

标签: spring autowired inject qualifiers

我有bean配置:

<bean id="PostLoginUpdater" class="xyz.auth.PostLoginUpdater" autowire="byType" />

public class PostLoginUpdater implements PostLoginStatePersonalizer {

    //@Qualifier("CustomerManager")
    @Inject
    //@Resource(name = "CustomerManager")      
    private CustomerManager customerManager;

    public void setCustomerManager(CustomerManager customerManager)
    {
        this.customerManager = customerManager;
    }
}

因为有两个bean实现了CustomerManager,所以我得到了这个错误:

  

没有定义[CustomerManager]类型的唯一bean:预期单个   匹配bean但发现2

正如你所看到的,我尝试了几种组合(@Inject和@Qualifier,@ Resource,只有@Qualifier)但是我没有摆脱这个错误信息。

根据Spring In Depth,@Qualifier can be used along with @Inject。如果我在bean配置中定义了autowire =“byType”,我不能一起使用它们吗?

我不使用<context:annotation-config /><context:component-scan />

3 个答案:

答案 0 :(得分:1)

如果你有多个相同类型的bean,你应该可以使用'@Inject'和'@Qualifier'的组合。以下是配置它的方法 -

    <bean id="PostLoginUpdater" class="xyz.auth.PostLoginUpdater" autowire="byType" />
<bean id="firstManager" class="xyz.manager.CustomerManager" autowire="byType" >
    <qualifier>first</qualifier>
</bean>
<bean id="secondManager" class="xyz.manager.CustomerManager" autowire="byType" >
    <qualifier>second</qualifier>
</bean>

如果您有两个类型为'CustomerManager'的bean,如上所示,您可以使用下面显示的代码段进行注入 -

 public class PostLoginUpdater implements PostLoginStatePersonalizer {

    @Inject
    @Qualifier("first")
    private CustomerManager customerManager;

    public void setCustomerManager(CustomerManager customerManager)
    {
        this.customerManager = customerManager;
    }
}

另外,在旁注 -

如果您经常使用其中一个bean,则可以使用“primary”属性。

例如,在上面的示例中,如果您总是倾向于使用“firstManager”,则可以将其标记为主要,如下所示。

<bean id="PostLoginUpdater" class="xyz.auth.PostLoginUpdater" autowire="byType" />
    <bean id="firstManager" class="xyz.manager.CustomerManager" autowire="byType" primary="true" >
    </bean>
    <bean id="secondManager" class="xyz.manager.CustomerManager" autowire="byType" >
        <qualifier>second</qualifier>
    </bean>

如果你有以上配置,当没有使用限定符时,以下代码将始终注入'firstManager' -

public class PostLoginUpdater implements PostLoginStatePersonalizer {

    @Inject
    private CustomerManager customerManager;

    public void setCustomerManager(CustomerManager customerManager)
    {
        this.customerManager = customerManager;
    }
}

答案 1 :(得分:0)

尝试按类型自动装配并同时指定名称没有任何意义。选择一种方法或另一种方法。

答案 2 :(得分:0)

过去我也遇到麻烦,试图将@Qualifier与@Inject一起使用。需要注意的一点是,有两个带有该名称的注释,一个在Spring中,一个在Java中:

org.springframework.beans.factory.annotation.Qualifier
javax.inject.Qualifier

但是,如果使用spring框架,那么建议的用法是通过@Component或@Named [@Component(“beanName”)](如果注释)或<bean>显式命名组件。定义。请注意,自动装配需要bean名称,而不是示例中的类名称(即不要使用“CustomerManager”)。例如,如果你有两个bean定义,比如Sashi的例子:

<bean id="firstManager" class="xyz.manager.CustomerManager" autowire="byType" >
    <qualifier>first</qualifier>
</bean>
<bean id="secondManager" class="xyz.manager.CustomerManager" autowire="byType" >
    <qualifier>second</qualifier>
</bean>

然后声明这样的字段:

@Inject
@Qualifier("firstManager") 
private CustomerManager customerManager;