首页 > 编程语言 >从Spring源码分析@Autowired依赖注入实现原理

从Spring源码分析@Autowired依赖注入实现原理

时间:2023-05-04 10:00:09浏览次数:39  
标签:依赖 Autowired -- Spring 源码 方法

  在平常项目开发中,使用@Autowired注解进行字段注入很常用,本篇就通过Spring源码,重点分析这种方式实现依赖注入的过程。

  本篇Spring源码版本为5.1.7.RELEASE。

  在源码中,关键类是AbstractAutowireCapableBeanFactory,这个类继承AbstractBeanFactory,所以在Spring上下文启动的refresh方法中,invokeBeanFactoryPostProcessors方法会调用其createBean方法。这个类的createBean方法可以作为源码分析的切入点。

  一、AbstractAutowireCapableBeanFactory#createBean

  方法的简化版如下:

   

  二、AbstractAutowireCapableBeanFactory#doCreateBean

  doCreateBean方法是核心部分,简化代码如下:

  

  Spring Bean生命周期的4个阶段,实例化-->属性赋值-->初始化--> 销毁,前三个阶段的源码都在doCreateBean方法中。了解Spring Bean生命周期的时候,也是分析这部分源码。

  依赖注入发生在步骤2--属性赋值阶段,即populateBean方法。

  三、AbstractAutowireCapableBeanFactory#populateBean

  

   populateBean方法中,postProcessProperties方法是依赖处理的关键方法。

   InstantiationAwareBeanPostProcessor是一个接口,@Autowired的依赖注入方式有实现类AutowiredAnnotationBeanPostProcessor,对postProcessProperties方法有重写。所以直接看AutowiredAnnotationBeanPostProcessor。

  四、AutowiredAnnotationBeanPostProcessor#postProcessProperties

  

    这个方法中,findAutowiringMetadata方法的目的是确定当前Bean中标注了@Autowired注解的字段或方法。

  InjectionMetadata.inject方法则是进行依赖注入的过程。

  五、AutowiredAnnotationBeanPostProcessor#findAutowiringMetadata

  

    在AutowiredAnnotationBeanPostProcessor中,有两个内部类AutowiredFieldElement和AutowiredMethodElement。findAutowiringMetadata方法返回的InjectionMetadata对象,其injectedElements属性会被包装为AutowiredFieldElement和AutowiredMethodElement。

  六、AutowiredAnnotationBeanPostProcessor#buildAutowiringMetadata

  

    buildAutowiringMetadata方法做的事情就是通过反射,寻找当前Bean中哪些字段或者方法标注了@Autowired注解,这些字段和方法就是现在这个Bean需要进行依赖注入的对象。这段代码也可以解释为什么@Autowired不能用在static字段和方法上,底层都对static修饰的字段和方法判断为不处理。

  七、AutowiredFieldElement#inject、AutowiredMethodElement#inject

  metadata.inject执行的是当前内部类AutowiredFieldElement和AutowiredMethodElement的inject方法。以AutowiredFieldElement为例,代码如下:

   

    可以看到,其实Spring的依赖处理过程主要是通过DefaultListableBeanFactory#resolveDependency方法来操作。

  源码当中的调用流程为:resolveDependency-->doResolveDependency-->findAutowireCandidates-->addCandidateEntry-->DependencyDescriptor#resolveCandidate-->BeanFactory#getBean

  源码中调用流程很长,有很多的判断逻辑,但最终目的是获取到依赖对象,再通过反射进行依赖注入。

  @Autowired进行依赖注入的流程整体就是如此,这部分源码本身也是Spring Bean生命周期的一部分内容。

   

 

标签:依赖,Autowired,--,Spring,源码,方法
From: https://www.cnblogs.com/sunshine-ground-poems/p/17247977.html

相关文章

  • Spring整合Junit
    Spring整合Junit整合Junit与整合Druid和MyBatis差异比较大,为什么呢?Junit是一个搞单元测试用的工具,它不是我们程序的主体,也不会参加最终程序的运行,从作用上来说就和之前的东西不一样,它不是做功能的,看做是一个辅助工具就可以了。1、环境准备这块环境,大家可以直接使用Spring与Myb......
  • 【开源项目】智慧污水水厂~国企污水厂数字孪生可视化项目——开源工程及源码
    国企某大型污水厂的工程和源码免费送!实现智慧污水厂的数字孪生,轻松掌控厂内运行情况!项目介绍智慧污水厂采用数字孪生技术,将现实中的数据和场景完整地克隆到虚拟现实中,展现污水厂的精细化管理,可视化厂内设备、管道等的具体运行情况,大幅提高了工作效率,为产业发展注入新动力。智慧水厂......
  • 基于springcloud实现的医院信息系统
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]医疗信息就诊系统,系统主要功能按照数据流量、流向及处理过程分为临床诊疗、药品管理、财务管理、患者管理。诊疗活动由各工作站配合完成,并将临床信息进行整理、处理、汇总、统计、分析等。本系统包括以下工作站:门诊医生工作站、药房......
  • AQS源码分析
    AQS源码分析--哔哩哔哩(通俗易懂)AQS实现原理看这一篇就够了 ......
  • 记录一件很神奇的类型转换问题(springboot项目+echarts)
    今天博主在应付学校的实验,想要使用echarts绘制一张很简单的条形图(博主是初学者),如下(时间还未作排序) 对于横轴,我封装了一个dateList,这个datelist是用java,将数据库中date类型的数据,提取其年月拼装而成的,代码如下:Stringdate=String.valueOf(art.getArticleCreateTime().getYea......
  • java基于springboot+vue非前后端分离的网上商城购物系统、在线商城管理系统,附源码+数
    1、项目介绍java基于springboot+vue非前后端分离的网上商城购物系统、在线商城管理系统,实现管理员:首页、个人中心、用户管理、商品分类管理、商品信息管理、订单评价管理、系统管理、订单管理,用户;首页、个人中心、订单评价管理、我的收藏管理、订单管理,前台首页;首页、商品信息、......
  • SpringCloud gateway谓词
    1、AfterRoutePredicateFactoryAfter路由谓词工厂接受一个参数,一个日期时间(它是一个javaZonedDateTime)。此谓词匹配在指定日期时间之后发生的请求。例如:spring:cloud:gateway:enabled:trueroutes:-id:Goods-Server#路由id,唯一标识......
  • SpringCloud之gateway使用
    使用SpringCloudGateway是为了取代Zuul而开发出来的新一代网关,采用了响应式编程。 新建ModuleGatewayServer,添加依赖:<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></depe......
  • SpringBoot定义优雅全局统一Restful API 响应框架二
    这里解决之前留下来的问题,当程序没有正常返回时候就是程序由于运行时异常导致的结果,有些异常我们可,能无法提前预知,不能正常走到我们return的R对象返回。这个时候该如何处理在SpringBoot中,可以使用@ControllerAdvice注解来启用全局异常处理。通过使用@ControllerAdvice注解,可以捕......
  • 【SpringBoot系列】八、SpringBoot 中的事务处理
        前两章节主要讲解了在SpringBoot中关于对数据的操作,本章节将介绍如何进行事务处理。所有的数据访问技术都离不开事务处理,否则将会造成数据不一致。事务是一系列的动作,一旦其中有一个动作出现错误,必须全部回滚,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务......