@Autowired @Resource 有区别吗
一.背景
@Autowired --- spring自己创造的,只有spring框架实现了该注解的处理逻辑
@Resource --- j2ee规范中的,支持j2ee的框架都实现了该注解的处理逻辑
两个注解都是为了实现依赖注入(DI),进而实现控制反转(IOC);
二.工作原理
i. 结论:
其实这两种注解工作原理是一样的。
不像网上说的,@Autowired 先用type(类型)找,再用name找; @Resource 先用name找,再用type找。
统一的流程如下:
1.type匹配规则:
1.1如果明确指定type,符合要求的bean一定是这个type才行,并且这个type要是目标引用类型本身、或者其子类、或者其实现类
1.2如果未明确指定,要保证找到的bean能赋值给目标引用,就是符合要求的bean类型必须是目标引用类型本身、或者其子类、或者其实现类
1.3如果没有符合type要求的bean,那就注入失败了,流程结束;否则进行name匹配
2.name匹配规则:
2.1明确指定了name,符合要求的bean的name一定要等于这个name
2.2如果未明确指定name
2.2.1如果符合type类型要求的bean如果有多个,会用目标引用名称作为name,去选择bean的name等于该目标引用名称的那个bean
2.2.2只有一个bean符合类型要求,不进行name匹配,直接使用这个bean
3.如果没找到唯一的bean,就会报错;否则把找到的bean注入到目标引用
注意: @Autowired有required属性,如果设置为false,找不到bean时候,不会报错,这个参数默认是true
ii.例子
2.1 无bean能赋值给目标引用(就是无bean是目标引用类型本身或者其子类或者其实现类),会导致无法找到bean
2.2 如果指定一个不存在的name(无bean用这个名字),会导致无法找到bean
2.3 指定一个存在的name,只要对应bean符合类型要求,就能找到bean
2.4 不指定name,满足该类型的bean只有一个时,可以找到bean
2.5 不指定name,满足该类型的bean有多个时,目标引用名称和某个bean名称一致时,能找到bean
2.6 不指定name,满足该类型的bean有多个,目标引用名称不能匹配任何bean时,会无法确定用哪个bean,进而报错