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,第二个问题涉及的步骤无效

猜你喜欢

转载自blog.csdn.net/u012098021/article/details/106147324