Spring Bean 注册 以及 refresh方法

9 篇文章 0 订阅
Spring Bean的注册
  1. 实例化 Spring 上下文环境 AnnotationConfigApplicationContext;如果初始化的的时候没有设置工厂就通过父类使用默认的工厂:DefaultListableBeanFactory在这里插入图片描述
    在这里插入图片描述

  2. 初始化 AnnotatedBeanDefinitionReader, BeanDefinition 阅读器

在这里插入图片描述

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

在这里插入图片描述

  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<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
      List<BeanDefinitionRegistryPostProcessor> 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.beans.factory.config.BeanDefinitionHolder>)

      进行类型封装

      org.springframework.context.annotation.ConfigurationClassParser#processConfigurationClass

      解析配置类;

      org.springframework.context.annotation.ConfigurationClassParser#doProcessConfigurationClass

      1、处理内部类;
      在这里插入图片描述
      2、解析扫描包

在这里插入图片描述

 解析扫描的一些基本信息

 org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值