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 许可协议。