【问题标题】:Can't use @Qualifier along with @Inject and autowire="byType"不能将 @Qualifier 与 @Inject 和 autowire="byType" 一起使用
【发布时间】:2012-10-23 07:43:26
【问题描述】:

我有 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 can be used along with @Inject。如果我在 bean config 中定义了 autowire="byType" 不能一起使用吗?

而且我不使用&lt;context:annotation-config /&gt;&lt;context:component-scan /&gt;

【问题讨论】:

    标签: spring autowired inject qualifiers


    【解决方案1】:

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

    【讨论】:

    • 当然,这太局限了。 autowire 属性仅指定一个默认值,每个属性都可以覆盖该默认值。
    【解决方案2】:

    如果您有多个相同类型的 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,如上所示,你可以使用如下所示的 sn-p 进行注入 -

     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;
        }
    }
    

    【讨论】:

    • 不幸的是,这不起作用。并且 &lt;qualifier&gt; 不是必需的 SpringDoc 。我将显式注入属性,在过去的几天里遇到了太多的自动装配问题。
    【解决方案3】:

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

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

    但是,如果使用 spring 框架之一,那么建议的用法是通过 @Component 或 @Named [@Component("beanName")](如果已注释)或在 &lt;bean&gt; 定义中显式命名您的组件。请注意,自动装配需要 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;
    

    【讨论】:

    • 这是另一个很好的 Spring 参考,用于使用 @Qualifier 和其他注释 here
    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多