我复制了您的确切错误消息,然后修复了它。这正是我使用的源代码,减去包名。我建议复制它,运行它并与你的不同。我注意到的一个区别是,正如问题中所写,AImpl 无法编译。它实现了 GenericDAOImpl 和 GenericDAO。我将第一个通用参数更改为 Turno,以使其编译。我认为这是一个错字。当我最初将所有字段设置为 @Autowired 时,我准确地重现了您的错误。然后我添加了 @Qualifier("genericDAO") 并成功连接了所有三个。
public interface GenericDAO<T, ID extends Serializable> {}
...
@Repository("genericDAO")
public class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {}
...
public interface A extends GenericDAO<Turno, Long> {}
...
public interface B extends GenericDAO<TipoTurno, Long> {}
...
@Repository("A")
public class AImpl extends GenericDAOImpl<Turno, Long> implements A {}
...
@Repository("B")
public class BImpl extends GenericDAOImpl<TipoTurno, Long> implements B {}
...
public class TipoTurno {}
...
public class Turno {}
...
@Component
public class Thingy {
@Autowired
private A a;
@Autowired
private B b;
@Autowired
@Qualifier(value="genericDAO")
private GenericDAO genericDao;
}
...
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("genericdao.xml");
context.getBean(Thingy.class);
}
}
...
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
<context:component-scan base-package="genericdao"/>
</beans>
请注意,实际的错误消息比您提供的要长。阅读整件事寻找原因很重要。Spring 喜欢具有 5 甚至 10 级原因的异常堆栈跟踪。这是我收到的消息的相关子字符串:
无法自动装配字段:genericdao.GenericDAO genericdao.Thingy.genericDao;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义类型 [genericdao.GenericDAO] 的唯一 bean:预期单个匹配 bean 但找到 3:[A,B,genericDAO]
它表明没有被自动装配的字段是Thingy.genericDao
,不是Thingy.a
。我强烈怀疑这也是您的错误的情况。