Spring @Autowired和@Resource

@Autowired和@Resource有什么区别

1.spring在创建bean之后 开始进行bean的初始化工作,遍历所有的processors,找出InstantiationAwareBeanPostProcessor类型的processor进行bean的后处理。[AbstractAutowireCapableBeanFactory.populateBean]

2.其中:
Autowired对应的processor是AutowiredAnnotationBeanPostProcessor
Resource对应的processor是CommonAnnotationBeanPostProcessor

@Autowired

Autowired默认按照bean类型查找(bean),如果找到多个时,会再次尝试根据name进行匹配,匹配不到报错。(图1)
通过设置name (配置了@Qualifier) 会在类型匹配时,直接过滤name不匹配的类型。(图2和图3)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@Resource

Resource默认按照bean名字进行查找(bean),找不到会重新根据类型查找。(如果设置了name并且找不到会报错,不会根据类型找)
上述有个前提!!!:需要注入的bean的字段名必须能匹配到bean,否则还是按照type进行查找。
图2解读:当按照名字查不到bean时,才会根据类型找,这个时候如果设置了type,type才会生效 不然设置了也没用。!factory.containsBean(name)在name可以找到时,直接忽略了type查找。

在这里插入图片描述

3.问题整理:

3.1按照类型查找仍使用name过滤Type
只有设置了@Qualifier时才会在查找类型时进行过滤,不设置会先查找所有匹配的类型,多于一个时才会进入第二个问题

3.2匹配到多个类型仍尝试用name找合适的determineAutowireCandidate
返回多个匹配类型,此时根据字段名再次尝试匹配可自动注入的bean,若上一步配置了@Qualifier,则此处相当于无效

3.3@Resource是否可以使用@Qualifier

可以,在属性名不能匹配到bean时,若配置@Qualifier设置bean名字则会等同@Autowired效果,进入类型匹配 根据Qualifier过滤类型

1和2问题 对于@Resource均无效,问题1@Resource配置name不会进入type查找,问题2若进入类型查找说明name无法匹配bean,第二个问题涉及的步骤无效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值