我有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 />
答案 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;