我有2个类(B,C)扩展了A类。
@Service
public class A extends AbstratClass<Modele>{
@Autowired
A(MyClass br) {
super(br);
}
@Service
public class B extends A{
@Autowired
B (MyClass br) {
super(br);
}
@Service
public class C extends A{
@Autowired
C (MyClass br) {
super(br);
}
但我有这样的信息:
没有定义类型[A]的唯一bean:预期的单个匹配bean但找到2:[A,B,moveModeleMarshaller]
我真的不知道为什么我有这个消息&amp;阅读Spring文档后如何解决。
提前致谢。
答案 0 :(得分:15)
您应该使用@Qualifier
注释将类改写为类似的内容。
@Service
@Qualifier("a")
public class A extends AbstratClass<Modele>{
@Autowired
A(MyClass br) {
super(br);
}
@Service
@Qualifier("b")
public class B extends A{
@Autowired
B (MyClass br) {
super(br);
}
@Service
@Qualifier("c")
public class C extends A{
@Autowired
C (MyClass br) {
super(br);
}
你还必须在类型A的实例上使用@Qualifier注释,你将Spring bean自动装入。
这样的事情:
public class Demo {
@Autowired
@Qualifier("a")
private A a;
@Autowired
@Qualifier("b")
private A a2;
public void demo(..) {..}
}
如果您不希望在生产代码中使用此Spring配置,则必须使用XML或Java配置编写依赖注入逻辑。
您还可以指定类型为A的默认bean,其中@Primary
注释位于一个扩展类型A的服务类之上。然后,Spring可以自动装配而不指定@Qualifier
注释。
由于Spring永远不会尝试猜测要注入哪个bean,因此只要有多个类型的bean,就必须指定哪个bean或用@Primary
标记其中一个bean。
答案 1 :(得分:4)
您正在尝试(在其他地方)自动装配A
类型的bean。类似的东西:
@Autowired
private A beanA;
但你有两个符合这个要求的豆子。
您可以使用@Resource
并确切指定哪个bean来解决此问题:
@Resource("b")
private A beanA;
(其中“b”是注入bean的名称)或使用@Qualifier
注释。
答案 2 :(得分:2)
通常,在定义两个具有相同类
的bean时会出现此错误<bean id="a" class="com.package.MyClass"/>
<bean id="b" class="com.package.MyClass"/>
如果你解决上面两行,我们有两个具有相同类的bean。
当您尝试在任何其他类别中自动装配此类时,您将收到此类错误
你有两个解决方案
第一种方法
通过定义bean id init来使用限定符 像这样
@Autowired
@Qualifier("a")
MyClass a;
@Autowired
@Qualifier("b")
MyClass b;
第二种方法
使用JSR250 api(它可以放入类路径的jar文件
然后执行如下所示的自动装配
@Resource("a")
MyClass a
@Resource("b")
MyClass a