Spring Bean 注册 以及 refresh方法

Spring Bean的注册
  1. 实例化 Spring 上下文环境 AnnotationConfigApplicationContext;如果初始化的的时候没有设置工厂就通过父类使用默认的工厂:DefaultListableBeanFactorySpring Bean 注册 以及 refresh方法_第1张图片
    Spring Bean 注册 以及 refresh方法_第2张图片

  2. 初始化 AnnotatedBeanDefinitionReader, BeanDefinition 阅读器

在这里插入图片描述

  1. 开始注册工作(通过 AnnotatedBeanDefinitionReader 注册 Bean )org.springframework.context.annotation.AnnotationConfigUtils#registerAnnotationConfigProcessors(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)

Spring Bean 注册 以及 refresh方法_第3张图片

  1. org.springframework.context.annotation.AnnotationConfigUtils#registerPostProcessor

    org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition将 BeanDefinition 注册到 map 当中
    在这里插入图片描述

  2. 手动注册 Bean

    org.springframework.context.annotation.AnnotationConfigApplicationContext#register

    org.springframework.context.annotation.AnnotationConfigApplicationContext#register

    org.springframework.context.annotation.AnnotatedBeanDefinitionReader#doRegisterBean

    org.springframework.beans.factory.support.BeanDefinitionReaderUtils#registerBeanDefinition

  3. 初始化 ClassPathBeanDefinitionScanner

Spring 生命周期 refresh 方法
  1. 准备工作,设置启动时间,是否激活标识位,初始化属性源配置org.springframework.context.support.AbstractApplicationContext#prepareRefresh

  2. 获取 Bean 工厂,对 Bean 工厂进行属性设置org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory

    • 添加类加载器

      org.springframework.beans.factory.config.ConfigurableBeanFactory#setBeanClassLoader

    • 添加 Bean 表达式解析器org.springframework.beans.factory.config.ConfigurableBeanFactory#setBeanExpressionResolver

    • 添加后置处理器

      org.springframework.beans.factory.config.ConfigurableBeanFactory#addBeanPostProcessor

    • 添加自动注入被忽略的列表

      org.springframework.beans.factory.config.ConfigurableListableBeanFactory#ignoreDependencyInterface

    • 依赖注册(后续重要)

      org.springframework.beans.factory.config.ConfigurableListableBeanFactory#registerResolvableDependency

    • 添加 ApplicationListenerDetector 后置处理器,检测实现了ApplicationListener的实现类

      org.springframework.beans.factory.config.ConfigurableBeanFactory#addBeanPostProcessor

  3. 目前没有实现

    org.springframework.context.support.AbstractApplicationContext#postProcessBeanFactory

  4. 执行后置处理器org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors

    • 获取程序员自定义的没有被Spring管理的 BeanFactoryPostProcessor

      org.springframework.context.support.AbstractApplicationContext#getBeanFactoryPostProcessors

    • 处理自定义的 BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor

      List regularPostProcessors = new ArrayList<>();
      List registryProcessors = new ArrayList<>();
      
    • 处理 Spring 内部的 BeanDefinitionRegistryPostProcessor

      org.springframework.beans.factory.ListableBeanFactory#getBeanNamesForType(java.lang.Class, boolean, boolean)

    • 合并内部的和自定义的 BeanDefinitionRegistryPostProcessor

    • 调用了下面的方法org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors

      调用扩展方法

      org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry

      调用下面方法

      org.springframework.context.annotation.ConfigurationClassPostProcessor#processConfigBeanDefinitions

      调用下面方法获取类的元数据(类的信息)来判断 BeanDefinition 是否包含 @Configuration 注解,如果包含则将这个 bd 标记为 FULL 注解

      org.springframework.context.annotation.ConfigurationClassUtils#checkConfigurationClassCandidate

      扫描包

      org.springframework.context.annotation.ConfigurationClassParser#parse(java.util.Set)

      进行类型封装

      org.springframework.context.annotation.ConfigurationClassParser#processConfigurationClass

      解析配置类;

      org.springframework.context.annotation.ConfigurationClassParser#doProcessConfigurationClass

      1、处理内部类;
      Spring Bean 注册 以及 refresh方法_第4张图片
      2、解析扫描包

Spring Bean 注册 以及 refresh方法_第5张图片

 解析扫描的一些基本信息

 org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan

你可能感兴趣的:(JAVA,教程)