一、注解的作用
@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自动注入顺序流程图:
@Resource默认按名称注入,如果按名称注入找不到合适的bean,则再按类型注入。
@Resource自动注入顺序流程图:
也就是:
- @Autowired默认先根据类型查找,如果找到多个,再根据名称查找;
- @Resource默认先根据名称查找,如果找不到,再按类型查找。
三、总结
在Spring项目中,这两个注解一般可以互相替换。
主要是要了解它们的注入顺序。