NoUniqueBeanDefinitionException:...期望的单个匹配bean但找到2:

时间:2016-01-08 08:29:46

标签: java spring-mvc autowired

我有这个超级班:

@Component
public class DAOBase {
}

另一个类扩展了DAOBase

@Component
public class VoceDAO extends DAOBase{       
}

当我以这种方式AutoWired类DAOBase时

@Service
public class TransactionService {
    @Autowired
    private DAOBase dAOBase;
}

我收到此错误:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.jeansedizioni.dao.DAOBase] is defined: expected single matching bean but found 2: DAOBase,voceDAO
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:865)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:770)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)
    ... 37 more

阅读一些帖子我发现了这个解决方案:

@Component("DAOBaseBeanName")
public class DAOBase {
}

我想确保我完全理解这个解决方案。 使用@Component("DAOBaseBeanName"),我为类DAOBase提供了特定的名称" DAOBaseBeanName",应用程序可以使用它来识别DAOBase类,以免将其与扩展DAOBase的其他类混淆。是不是?

谢谢。

3 个答案:

答案 0 :(得分:3)

尝试添加@Qualifier注释,如下所示:

 @Autowired
 @Qualifier("dAOBase")
 private DAOBase dAOBase;

指定要在课程中注入的bean DAOBasevoceDAO)。

答案 1 :(得分:0)

是的,就像你写的那样。您还可以指定在使用限定符注释自动装配bean时要注入的实现。

答案 2 :(得分:0)

@Resource(name =“ {your child class name}”)起作用但@Autowired有时不起作用的原因是由于它们的匹配顺序不同

@Autowire的匹配顺序
类型,限定词,名称

@Resource的匹配顺序
名称,类型,限定符

更详细的解释可以在这里找到:
Inject and Resource and Autowired annotations

在这种情况下,从父类或接口继承的不同子类会混淆@Autowire,因为它们来自同一类型。由于@Resource使用Name作为第一个匹配优先级,因此可以使用。