@Autowired和@Resource有哪些区别

一、注解的作用

@Autowired和@Resource都是用来实现Bean的自动注入功能。

二、@Autowired和@Resource的区别

1、所属的包不同

  • @Autowired是Spring的注解。
  • @Resource是JSR-250的注解。

IDEA 有时候会在 @Autowired 注解上面提示Field injection is not recommended (字段注入是不被推荐的)这个警告,虽然并不属于报错,但是确实是警告的存在。
就是因为@Autowired是Spring提供的,它是特定IoC提供的特定注解,这就导致了应用与框架的强绑定,一旦换用了其他的IoC框架,是不能够支持注入的。
而 @Resource是 Java 自己提供的,它是Java标准,所以它是与框架无关的。

2、依赖注入的支持不同

  • @Autowired能够用在构造函数、setter方法、属性上。
  • @Resource只能用在setter方法、属性上。

3、注入的默认类型不同

依赖注入功能,是先在容器中查找需要的对象,再将对象注入到当前类中。
查找的方式有两种:

  • byType:根据类型注入,如果容器中有多个相同类型的bean,则注入失败。
  • byName:根据名称注入,如果容器中有多个相同名称的bean,则注入失败。

@Autowired和@Resource都用到了byType和byName两种方式,但二者的使用顺序却不同。

@Autowired默认按类型注入,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false。
如果根据类型找不到合适的bean,则会抛出异常。
如果根据类型找到了多个bean,则再根据bean的名称进行匹配,如果匹配成功,则注入成功;如果匹配失败,则抛出异常。

@Autowired自动注入顺序流程图:
@Autowired和@Resource有哪些区别

@Resource默认按名称注入,如果按名称注入找不到合适的bean,则再按类型注入。

@Resource自动注入顺序流程图:
@Autowired和@Resource有哪些区别

也就是:

  • @Autowired默认先根据类型查找,如果找到多个,再根据名称查找;
  • @Resource默认先根据名称查找,如果找不到,再按类型查找。

三、总结

在Spring项目中,这两个注解一般可以互相替换。
主要是要了解它们的注入顺序。

发表评论

相关文章