@Autowired和@Resource注解的区别

254 阅读1分钟

相同点:

  1. @Autowred 和 @Resource 都是可以用来依赖注入
  2. 都可以写在字段或者 setter方法上,两者如果写在字段上,则不需要再写setter 方法

不同点:

提供者不同:

  1. @Autowired 是Spring 提供的注解 需要导入 org.springframework.beans.factory.annotation.Autowired ;
  2. @Resource 是 JavaEE 提供的注解,需要导入 javax.annotation.Resource

注入的方式不同:

  1. @Autowired 采取的策略是按照类型注入,如果一个类型存在多个bean 的时候,会造成无法注入成功的情况,这个时候则需要使用 @Qualifier 使用;
/** 
* @Autowired@Qualifier 搭配使用
**/
@Autowired
@Qualifier("bean的名字")
private Type beanName;
  1. @Resource 默认采取 byName 的方式进行注入;

    1. 如果同时指定 name 和 type ,则从Spring 上下文中找到唯一匹配的bean进行注入,找不到则会抛出异常;
    2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行注入,找不到抛出异常;
    3. 如果指定了type,则从上下文中查找类型匹配的bean进行注入,找不到或者找到多个抛出异常;
    4. 如果没有指定 name,也没有指定type,则自动按照byName 的方式进行依赖注入,如果没有匹配,则回退一个原始类型进行匹配(按照类型匹配),如果匹配则依赖注入。

internalBeanPostProcessor 解析不同:

  1. 使用 @Autowired 注解,AutowiredAnnotationBeanPostProcessor拿到的injectedElements集合就不为空,AutowiredAnnotationBeanPostProcessor来完成注入的工作。
  2. 使用 @Resource 注解,CommonAnnotationBeanPostProcessor拿到集合injectedElements就不为空,由CommonAnnotationBeanPostProcessor来完成注入工作。