• 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
    返回要注入的对象
  • 相关阅读:
    列表标签(非常重要)
    C++中double类型使用技巧
    Selenium WebUI 自动化测试框架
    qt 绘图
    vue快速入门(四十四)自定义组件
    期货怎么克服频繁止损(期货交易怎么止损)
    c++ 高效使用vector(面试)
    【JAVA高级】——初识JDBC中DAO数据访问对象
    线代(高斯消元法、线性基)
    Vulkan并非“灵药“
  • 原文地址:https://blog.csdn.net/TheThirdMoon/article/details/130421763