spring源码之@Resource

这个注解加载的时候经过的类是CommonAnnotationBeanPostProcessor
和Autowired一样,也是postProcessProperties()方法。
而且
InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs);
这一行的内部流程和AutowiredAnnotationBeanPostProcessor是一样的所以看一下就可以,不在这里一一解析了。
在这里插入图片描述
不一样的点在于inject()方法的调用,这个inject()方法调用的是父类里面的,并没有像Autowired里面一样调用子类Element的inject()方法。

主要代码就在红框中

getResourceToInject()方法来获取需要注入的对象I
按我们之前的例子中来说,需要往F类中注入I对象,那么target就是F,requestingBeanName就是I
在这里插入图片描述
Resource重写了Element的方法,所以进入了ResourceElement这个类中
if条件中的代码先不用看,这里这里暂时不会执行。
在这里插入图片描述
getResource()方法中代码有很多条件,最终执行的代码就是autowireResource()方法
在这里插入图片描述
首先是第一个if(factory instanceof AutowireCapableBeanFactory)
这里正常情况下都是会成立的:
可以通过AnnotationConfigApplicationContext()这个类看到,
AnnotationConfigApplicationContext-extends->GenericApplicationContext
GenericApplicationContext类中的属性DefaultListableBeanFactory-extends->AbstractAutowireCapableBeanFactory-extends->AbstractBeanFactory
关系有点不调好理,大概看一下知道这个if一定会成立就可以了。
在这里插入图片描述

那么Resource和Autowired主要的区别就在这一行。
第一个判断是写死的true不用管;
在这里插入图片描述

而第二个属性isDefaultName,在默认情况下是false,但是!在初始化的时候会判断@Resource注解后面有没有(name="")这个属性,如果有值的话,是false,如果没有值的话是true
在这里插入图片描述
再来看第三个判断,factory.containsBean(name)
这个方法就是,通过name去spring容器Map中查询,能不能找到这个单例bean;
或者在beanDefinition中能不能找到这个bean。
这两个区别在哪呢,前一个是已经实例化好的Bean,而后一个可以理解为存储Bean所有扫描到的对象。这个也是需要展开来讲的。
这里只需要知道,是去spring容器中通过name去查询bean就可以了。
在这里插入图片描述
而为什么要进行这个判断,这就是Resource和Autowired的主要区别,这里先通过name来获取Bean,如果按照我们之前的例子的话,就是直接通过”a“去获取Bean。

@Resource
I a;

我们再回来看这个代码,也就是说,进入了这个if判断的话,那就与Autowired没有区别了,而else中的逻辑才是通过name去查找Bean。
这就是Resource的注入逻辑
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木小同

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值