天天看点

注解@Autowired和@Resource的区别

自动绑定(Autowiring)模式

模式 说明
no 默认值,未激活Autowiring,需要手动执行依赖注入对象
byName 根据被注入属性的名称作为Bean名称进行依赖查找,并将对象设置到该属性
byType 根据被注入属性的类型作为依赖类型进行查找,并将对象设置到该属性
constructor 特殊的byType类型,用户构造器参数

@Autowired是spring的注解,@Resource是JSR-250中提供的注解,即Java注解。从包名可以看出来

Autowired:org.springframework.beans.factory.annotation;

Resource:javax.annotation;

@Autowired

@Autowired的注入过程是由AutowiredAnnotationBeanPostProscessor支持的,具体的注入逻辑在DefaultListableBeanFactory#doResolveDependency

@Autowired的注入逻辑如下:

  • 找到所有类型符合的bean
  • 如果没有类型符合的bean,则看@Autowired的required属性是否为true,,如果为true则抛出异常;否则返回null
  • 如果只有一个,则将这个bean注入
  • 如果多个bean
  • 选择其中带有@Primary注解的bean,如果只有一个bean带有该注解,则直接注入;如果有多个bean带有该注解,则报错;如果没有bean带有该注解,就进入下一步
  • 选择其中优先级最高的bean(优先级使用javax.annotation.Priority表明),如果只有一个直接注入,如果有多个bean的优先级并列最高则报错;如果不存在就进入下一步
  • 选择beanName和当前要注入的属性名称相同的bean进行注入,有则注入;没有则报错。

@Resource

@Resource的依赖注入是由CommonAnnotationBeanPostProcessor支持的

具体的注入逻辑在CommonAnnotationBeanPostProcessor#autowriedResource

@Resource的注入逻辑如下:

  • 如果@Resource指定了name,则只会按照name进行查找,当查找不到时抛出异常,找到bean注入
  • 如果@Resource没有找到name,则会把属性名作为名字进行查找,找到将bean注入,当按照名字差找不到时,按照类型进程查找。
  • 注意:
  • @Resource按照类型查找的逻辑和@Autowried的一样,因为都是调用了DefaultListableBeanFactory#doResolveDependency的方法