how to @Resource work in Spring
@Resource根据name匹配不到就退回到用type去匹配,@Autowire默认根据type去匹配,匹配不到也会根据name匹配。
@Autowire是因为有一个叫AutowiredAnnotationBeanPostProcessor的BeanPostProcessor,在Spring初始化的时候会去处理被@Autowire注解的类,对其进行注入,那@Resource呢,甚至在Spring Frame里都没有这个注解。
当然,这个注解是在JSR250(JSR: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注入的”
在CommonAnnotationBeanPostProcessor中,有一个控制回退到byType匹配的字段fallbackToDefaultTypeMatch,默认值就是true,如下图所示:


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


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