这是因为从bean容器中找到的bean不是唯一的,找到了2个匹配的bean,这时候注入bean就会报错。
比如说一个service接口有两个实现类
一、@Autowired方式注入
@Autowired是Spring提供的,默认是byType注入的,首先会在容器中查找对应类型的bean
如果找到结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果找到的结果不止一个,那么@Autowired会根据byName来查找
如果找不到,那么会抛出异常
解决办法
1、最简单的就是把属性名改成和实现类的名字一样
@Autowired默认是byType找不到,那么@Autowired会根据byName来查找
不推荐这样使用吧,毕竟属性名这样就固定了,依赖于实现类
2、使用@Primary标记实现类,@Primary 告诉spring 在犹豫的时候优先选择哪一个具体的实现
但是使用这个注解,会导致Spring默认调用的都是这个实现类的方法了,如下图所示
所以还是不太推荐这样使用,不过可以设置一个默认优先的,然后要用其他的可以配合@Qualifier使用
3、使用@Qualifier来指定bean的名称
推荐这样来指定名称。
二、@Resource方式注入
@Resource是java提供的,准确来说是JSR-250,默认是byName进行装配,
@Resource有两个属性,name和type;
如果两个属性都不指定,那么先通过byName匹配,匹配不到会进行byType匹配,如果匹配不到那么会通过反射机制byName进行装配;
如果指定name,不指定type,只会byName装配;
如果不指定name,指定type,只会byType装配;
如果两个属性都指定了,那么需要byName和byType都匹配才装配(不建议)。
解决办法
1、把属性名改成和对应实现类名一样
不建议这样用。
2、通过@Resource的name属性指定
三、@Inject方式注入
这种方式是Java提供的,准确来说是JSR-330,默认byType装配,可以配合@Named注解指定byName装配