我有这个超级班:
@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的其他类混淆。是不是?
谢谢。
答案 0 :(得分:3)
尝试添加@Qualifier
注释,如下所示:
@Autowired
@Qualifier("dAOBase")
private DAOBase dAOBase;
指定要在课程中注入的bean
DAOBase
或voceDAO
)。
答案 1 :(得分:0)
是的,就像你写的那样。您还可以指定在使用限定符注释自动装配bean时要注入的实现。
答案 2 :(得分:0)
@Resource(name =“ {your child class name}”)起作用但@Autowired有时不起作用的原因是由于它们的匹配顺序不同
@Autowire的匹配顺序
类型,限定词,名称
@Resource的匹配顺序
名称,类型,限定符
更详细的解释可以在这里找到:
Inject and Resource and Autowired annotations
在这种情况下,从父类或接口继承的不同子类会混淆@Autowire,因为它们来自同一类型。由于@Resource使用Name作为第一个匹配优先级,因此可以使用。