首页 > 其他分享 >org.springframework.beans.factory.NoUniqueBeanDefinitionException:expected single matching bean but

org.springframework.beans.factory.NoUniqueBeanDefinitionException:expected single matching bean but

时间:2023-02-18 13:11:42浏览次数:42  
标签:装配 byType Autowired byName factory springframework 指定 bean

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

 

 

 

 

 

 

 

标签:装配,byType,Autowired,byName,factory,springframework,指定,bean
From: https://www.cnblogs.com/pzw23/p/17132382.html

相关文章