• Spring Boot 2.x源码系列【3】启动流程深入解析之创建引导上下文


    有道无术,术尚可求,有术无道,止于术。

    本系列Spring Boot版本2.7.0

    前言

    在上篇文档,我们介绍了创建SpringApplication对象,然后调用run方法启动,在run方法中执行了很多步骤,接下来我们一步步分析。

    核心类和接口

    BootstrapContext

    我们知道在Spring 中有一个ApplicationContext(IOC容器),既可以创建bean、获取bean、还支持国际化、事件广播、获取资源等BeanFactory不具备的功能。

    在Spring Boot 启动开始阶段,需要初始化一些东西,这个时候并不会直接创建ApplicationContext,而是先创建BootstrapContext,在ApplicationContext完全创建好之前负责启动和准备环境(Environment)的一些操作。

    实际上它也是一个IOC 容器,可以看到其接口也定义了获取Bean 的方法。

    它的作用就是在启动阶段,创建一个引导性质的容器,先去负责一些初始化操作。
    在这里插入图片描述

    BootstrapRegistry

    BootstrapRegistry 就提供了在启动开始阶段,ApplicationContext完全创建好之前,负责Bean 实例注册的功能。

    可以看到该接口的方法,都是用于注册。
    在这里插入图片描述

    DefaultBootstrapContext

    DefaultBootstrapContext实现了BootstrapRegistryBootstrapContext接口,他们都是由Spring Boot 自己提供了接口。
    在这里插入图片描述
    可以看到,DefaultBootstrapContext就是一个简单的IOC 容器,实现了注册 Bean 和获取Bean 的一些方法。
    在这里插入图片描述
    只所以设计一个引导的思想,就是因为在刚开始启动阶段,而这时候应用的IOC 容器并没有创建好,就用要这个引导上下文去完成一些初始化的操作。

    BootstrapRegistryInitializer

    BootstrapRegistryInitializer 从字面上看是引导程序注册初始化器的意思。

    只声明了一个方法,传入了一个引导注册器参数。

    该接口的功能就是对BootstrapRegistry 进行初始化操作。

    @FunctionalInterface
    public interface BootstrapRegistryInitializer {
    
    	void initialize(BootstrapRegistry registry);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建引导上下文

    run方法的第一步就是执行了createBootstrapContext(),从中文意思上看,是创建一个引导上下文。

    		// 开始时间
    		long startTime = System.nanoTime();
    		// 初始化启动上下文
    		DefaultBootstrapContext bootstrapContext = createBootstrapContext();
    
    • 1
    • 2
    • 3
    • 4

    createBootstrapContext()只有两步:

    • 创建DefaultBootstrapContext 对象
    • 循环调用BootstrapRegistryInitializer对象的初始化方法
    	private DefaultBootstrapContext createBootstrapContext() {
    		DefaultBootstrapContext bootstrapContext = new DefaultBootstrapContext();
    		this.bootstrapRegistryInitializers.forEach((initializer) -> initializer.initialize(bootstrapContext));
    		return bootstrapContext;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    bootstrapRegistryInitializers 是在创建SpringApplication对象的时候通过SPI 机制在spring.factories 文件中获取的BootstrapRegistryInitializer实例对象。

    		this.bootstrapRegistryInitializers = new ArrayList<>(
    				getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
    
    • 1
    • 2

    bootstrapRegistryInitializers集合中,这里没有找到实例,所有也没有进一步操作。
    在这里插入图片描述
    最终,经过简单的步骤,DefaultBootstrapContext 对象就常见成功了,实际查看,发现该类没有什么东西:
    在这里插入图片描述

  • 相关阅读:
    从零开始操作系统-08:计时器
    【云原生之Docker实战】使用Docker部署Solo个人博客站点
    【frida】HLL 登录流程分析 找关键 Call
    并查集(合并集合,连通块的点的数量)
    AUTOSAR 面试知识回顾
    Vue3之uni-app中注册全局属性案例
    Linux bash参数解析
    Django笔记二十一之使用原生SQL查询数据库
    深度学习——第1章 深度学习的概念及神经网络的工作原理
    linux系统服务管理systemctl 和systemd
  • 原文地址:https://blog.csdn.net/qq_43437874/article/details/125445223