@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,进而报错  

             

            

 

 

            

 

posted @ 2022-02-10 14:56  高压锅里的大萝卜  阅读(49)  评论(0编辑  收藏  举报