@Resource根据name匹配不到就退回到用type去匹配,@Autowire默认根据type去匹配,匹配不到也会根据name匹配。

@Autowire是因为有一个叫AutowiredAnnotationBeanPostProcessorBeanPostProcessor,在Spring初始化的时候会去处理被@Autowire注解的类,对其进行注入,那@Resource呢,甚至在Spring Frame里都没有这个注解。

当然,这个注解是在JSR250JSR:Java Specification Requests 可以理解为JDK的需求,250是需求编号)中提出来的,这个注解在jakarta.annotation-api中,引入即可,是不是这样注解就生效了呢,并不是,注解只是标注,还是需要实现,那么@resource是谁来实现的呢?

CommonAnnotationBeanPostProcessor,这个BeanPostProcessor专门负责处理out-of-box的注解,也就是非Spring体系的注解,@Resource也不例外,它会扫描被@Resource注解了的类,然后调用inject方法进行注入,因为@Resource并不局限于Spring生态,JNDI也会定义“资源”,也是CommonAnnotationBeanPostProcessor负责实现。

具体的实现过程最好去debug一下才好理解。



先byName再byType解释

@Resource没有参数时,会先byName,这个name是被@Resource修饰的成员变量的名称,如果找不到才会退回到byType,而且就如下面所说的,“自己的类中注入自己是不会被byType注入的”

【成员变量的名称】
【bean的名称】


CommonAnnotationBeanPostProcessor中,有一个控制回退到byType匹配的字段fallbackToDefaultTypeMatch,默认值就是true,如下图所示:

upload successful

upload successful



果然是这样,自己的类中注入自己是不会被byType注入的(但是可以通过byName注入,容易死循环【就像一个没有出口的递归函数】,慎用)

upload successful

upload successful


本文作者:oldmee
本文链接:https://oldmee.github.io/2023/07/16/how-to-resource-annotation-work-in-spring/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。