Spring中的@Resource源码解析

 更新时间:2023年09月25日 08:54:25   作者:木小同  
这篇文章主要介绍了Spring中的@Resource源码解析,这个注解加载的时候经过的类是CommonAnnotationBeanPostProcessor和Autowired一样,也是postProcessProperties()方法,需要的朋友可以参考下

@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的注入逻辑

在这里插入图片描述

到此这篇关于Spring中的@Resource源码解析的文章就介绍到这了,更多相关@Resource源码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot实现IP地址解析的示例代码

    SpringBoot实现IP地址解析的示例代码

    本篇带大家实践在springboot项目中获取请求的ip与详细地址,我们的很多网站app中都已经新增了ip地址显示,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 分布式Netty源码分析概览

    分布式Netty源码分析概览

    这篇文章主要为大家介绍了分布式Netty源码分析概览,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • SpringDataJpa创建联合索引的实现

    SpringDataJpa创建联合索引的实现

    这篇文章主要介绍了SpringDataJpa创建联合索引的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot实现简单文件上传功能

    SpringBoot实现简单文件上传功能

    这篇文章主要为大家详细介绍了SpringBoot实现简单文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • SpringMVC拦截器失效问题及解决方法

    SpringMVC拦截器失效问题及解决方法

    这篇文章主要介绍了SpringMVC 拦截器和异常处理器,以及SpringMVC拦截器失效分析解决方案,文中补充介绍了SpringMVC 拦截器和异常处理器的相关知识,需要的朋友可以参考下
    2024-01-01
  • 详解在Spring Boot中使用数据库事务

    详解在Spring Boot中使用数据库事务

    本篇文章主要介绍了详解在Spring Boot中使用数据库事务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2017-05-05
  • SpringCloud Finchley Gateway 缓存请求Body和Form表单的实现

    SpringCloud Finchley Gateway 缓存请求Body和Form表单的实现

    在接入Spring-Cloud-Gateway时,可能有需求进行缓存Json-Body数据或者Form-Urlencoded数据的情况。这篇文章主要介绍了SpringCloud Finchley Gateway 缓存请求Body和Form表单的实现,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • SpringBoot生成二维码的实现

    SpringBoot生成二维码的实现

    这篇文章主要介绍了SpringBoot生成二维码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 浅谈spring和spring MVC的区别与关系

    浅谈spring和spring MVC的区别与关系

    下面小编就为大家带来一篇浅谈spring和spring MVC的区别与关系。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • IDEA 配置 JRebel 热部署的方法(推荐)

    IDEA 配置 JRebel 热部署的方法(推荐)

    这篇文章主要介绍了IDEA 配置 JRebel 热部署的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论