• spring-boot 依赖注入流程


    一、基本使用
    • 主要是三个注解的使用,@Autowired,@Value,@Resource
    二、实现步骤
    1. 拦截bean的创建
      要想拦截bean,就需要处理spring bean生命周期事件,spring通过一些接口来处理事件,实现属性注入,需要 InstantiationAwareBeanPostProcessor接口来完成。
    2. 找到注解的字段,并注入值
      获取被注解bean,然后从bean容器中中寻找响应类型的bean注入。
    三、@Autowired,@Value是如何实现的
    1. 拦截bean的创建
      • AutowiredAnnotationBeanPostProcessor实现了InstantiationAwareBeanPostProcessor接口
      • spring-boot 在启动的时候向容器中注入了AutowiredAnnotationBeanPostProcessor
    调用
    加载
    构造方法中加载
    构造方法中调用
    向容器中添加
    SpringApplication.run()
    createApplicationContext()
    AnnotationConfigServletWebServerApplicationContext.class
    AnnotatedBeanDefinitionReader.class
    AnnotationConfigUtils.registerAnnotationConfigProcessors()
    AutowiredAnnotationBeanPostProcessor
    1. 找到注解的字段,并注入值
      • 通过AutowiredAnnotationBeanPostProcessor.postProcessProperties()和AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()两个方法完成
      • 每一个需要依赖注入的bean都被封装成了InjectionMetadata对象,每个要备注入的字段被封装成了AutowiredFieldElement对象
    先调用
    调用
    调用
    后调用
    调用
    调用
    调用
    调用
    调用
    调用
    返回值
    创建bean流程
    AutowiredAnnotationBeanPostProcessor
    .postProcessMergedBeanDefinition()
    findAutowiringMetadata()
    InjectionMetadata.checkConfigMembers()
    AutowiredAnnotationBeanPostProcessor
    .postProcessProperties()
    findAutowiringMetadata()
    InjectionMetadata.inject()
    AutowiredFieldElement.inject()
    DefaultListableBeanFactory.resolveDependency
    DefaultListableBeanFactory.doResolveDependency
    getAutowireCandidateResolver()
    .getSuggestedValue(descriptor)
    是否字符串
    resolveEmbeddedValue()
    处理@Value注解
    findAutowireCandidates()
    处理@Autowired注解
    三、@Resource是如何实现的
    1. 拦截bean的创建
      • CommonAnnotationBeanPostProcessor实现了InstantiationAwareBeanPostProcessor接口
      • spring-boot 在启动的时候向容器中注入了CommonAnnotationBeanPostProcessor
    调用
    加载
    构造方法中加载
    构造方法中调用
    向容器中添加
    SpringApplication.run()
    createApplicationContext()
    AnnotationConfigServletWebServerApplicationContext.class
    AnnotatedBeanDefinitionReader.class
    AnnotationConfigUtils.registerAnnotationConfigProcessors()
    CommonAnnotationBeanPostProcessor
    1. 找到注解的字段,并注入值
      • CommonAnnotationBeanPostProcessor.postProcessProperties()和CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()两个方法完成
      • 每一个需要依赖注入的bean都被封装成了InjectionMetadata对象,每个要备注入的字段被封装成了ResourceElement对象
    先调用
    调用
    调用
    后调用
    调用
    调用
    调用
    调用
    调用
    调用
    调用
    创建bean流程
    CommonAnnotationBeanPostProcessor
    .postProcessMergedBeanDefinition()
    findAutowiringMetadata()
    InjectionMetadata.checkConfigMembers()
    CommonAnnotationBeanPostProcessor
    .postProcessProperties()
    findAutowiringMetadata()
    InjectionMetadata.inject()
    ResourceElement.inject()
    ResourceElement.getResourceToInject
    CommonAnnotationBeanPostProcessor
    .getResource
    CommonAnnotationBeanPostProcessor
    .autowireResource
    DefaultListableBeanFactory.resolveBeanByName
    返回要注入的对象
  • 相关阅读:
    Spark或Hive数仓生命周期管理
    如何选择适合的美颜SDK?
    NLP之基于Bi-LSTM和注意力机制的文本情感分类
    DockerFile详解以及测试案例
    Git - 基于IDEA/命令撤销工作区和暂存区的修改
    将PyCharm中的终端运行前面的PS修改成当前环境
    【前端】政务服务大数据可视化监控平台(源码+html+css+js)
    什么是自动化测试框架?如何搭建自动化测试框架详解
    NX二次开发-C++使用IDA Pro反编译dll,追踪查看里面使用的UFUN API函数(三部曲1)
    解决传奇hero引擎和登陆器不配套的方法
  • 原文地址:https://blog.csdn.net/TheThirdMoon/article/details/130421763