@Resource和@Autowired区别

1、⾃动绑定(Autowiring)模式

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

@AutowiredSpring中的注解, @ResourceJSR-250中提供的注解,即Java提供的注解,从包名就可以看出来
Autowired: org.springframework.beans.factory.annotation.Autowired
Resource: javax.annotation.Resource

@Autowired注入順序: @Autowired的依赖注⼊过程是由AutowiredAnnotationBeanPostProcessor⽀持的。具体的注⼊逻辑在DefaultListableBeanFactory#doResolveDependency

  1. 找到所有类型符合的bean
  2. 如果没有类型符合的bean,则看@Autowiredrequired属性是否为true,是则抛出异常,否则返回null
  3. 如果只有⼀个,则将这个bean注⼊
  4. 如果有多个bean
    4.1 选择其中带有Primary注解的bean,如果只有⼀个直接注⼊,如果有多个bean带有Primary注解则报错,如果不存在就下⼀步;
    4.2 选择其中优先级最⾼的bean(优先级使⽤javax.annotation.Priority表明),如果只有⼀个直接注⼊,如果有多个bean的优先级并列最⾼则报错,如果不存在就下⼀步
    4.3 选择beanName和当前要注⼊的属性名相同的bean进⾏注⼊,多个或者没有报错,单个则注⼊
    在这里插入图片描述

1、@Resource的依赖注⼊过程是由CommonAnnotationBeanPostProcessor⽀持的具体的注⼊逻辑在CommonAnnotationBeanPostProcessor#autowireResource
2、@Resource的注⼊逻辑如下

  1. 如果@Resource指定了name,则只会按照name进⾏查找,当找不到时抛出异常,找到将bean注⼊
  2. 如果@Resource没有指定name,则把属性名作为名字进⾏查找,找到将bean注⼊,当按照名字查找不到时,按照类型进⾏查找,单个注入,多个或者没有报错。
    在这里插入图片描述

注意:

  1. @Resource按照类型查找的逻辑和@Autowired的⼀样,因为都是调⽤了DefaultListableBeanFactory#doResolveDependency⽅法
  2. @Autowired:先byType再byName
    @Resource:先byName再byType(当指定@Resource name属性时,只会byName)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值