0

我有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、@Ressource,只有@Qualifier)但我没有摆脱这个错误消息。

根据 Spring In Depth,@Qualifier 可以与 @Inject 一起使用。如果我在 bean 配置中定义了 autowire="byType",我不能一起使用它们吗?

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

4

3 回答 3

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;
    }
}
于 2012-11-02T22:01:04.523 回答
0

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

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

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

<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;
于 2013-09-04T17:47:54.117 回答
0

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

于 2012-11-02T16:02:50.663 回答