这是因为从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装配