【注解篇】关于@Primary和@Autowired+@Qualified和@Resource注解的区别

tech2022-10-01  91

 ​  ​ ​  ​ ​  ​ ​  ​ ​  ​ ​  ​ ​  ​ ​  ​ ​  ​ ​  ​ ​  ​ ​  ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 😃​

 ​   当一个Service被两个Bean实现时,或者是其他接口被多个bean实现,那么当你再一个类中要引用这个接口就可能会报 Invalid bound statement (not found) 或者 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type等错误。

  ​ ​  这是因为一个接口被多个 bean 实现,所以引用依赖的时候就会不知道装载哪一个,这时候可以在需要装载的那个 bean 中加一个 @Primary 注解,代表这个bean被优先指定装载。而此时如果不想要指定唯一一个装载对象,而是按需求在不同类中指定装载对象,那么就需要在Service中加了@Service(“”)后再在指定类使用@Autowired和 @Qualifier(“”) 这两个注解,或者 @Resource    

例1:

​ ​  Bean1和Bean2都实现了BeanService,那么此时如果Bean2有@Primary注解,再另一个类中@Autowired或者@Component 引用此BeanService的时候就会默认是用Bean2这个类的方法。    

例2:

​ ​  Bean1和Bean2都实现了BeanService,那么想要在不同类中按需指定装载类则需先在BeanService中加@Service(“BeanService”)注解然后在Class_A中@Autowired 这个BeanService + @Qualifier(“Bean1”)注解,在Class_B中@Autowired这个BeanService+@Qualifier(“Bean2”)注解。这样在Class_A中使用的就会是Bean1的方法,Class_B中使用的就是Bean2的方法了。     ​ ​  或者是在BeanService加了表名名称的注解后再在Class_A中@Resource(name =“Bean1”)这个BeanService在Class_B中@Resource(name=“Bean2”)这个BeanService,这样能达到同样的效果。    

总结:

​​ ​  @Primary是在多个相同类型Bean存在时,被使用此注解的Bean会被默认选为被装载类。     ​​ ​  @Autowired+@Qualifier(“”)必须在一起使用,此注解是当存在多个相同类型Bean时,通过@Qualifier(“”)类中的名字来按需求指定被装载类。     ​​ ​  @Resource(name=“”)效果同上,也是当存在多个相同类型Bean时,通过@Resource(name=””)中的名字来按需求指定被装载类。     注:@Autowired+@Qualifier(“”) == @Resource(name = “”)     @Autowired是Spring注解,默认按类型装配,要求该对象必须存在(不能为null),如果允许对象为null则用@Autowired(requied=false)。在类型冲突情况下,想要按名称装配则使用@Qualifier(“”)注解。     @Resource是JDK注解,默认按名称装配,如果名称没有找到的情况下会默认转换为类型装配。如果要指定通过名称作为唯一条件进行装配,则使用@Resouce(name=””),反之想指定类型作为唯一条件进行装配则使用@Resource(type = “”)

[ 简要对比图 ]
最新回复(0)