栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

本系列Spring Boot版本2.7.0

文章目录
    • 前言
    • 核心类和接口
      • BootstrapContext
      • BootstrapRegistry
      • DefaultBootstrapContext
      • BootstrapRegistryInitializer
    • 创建引导上下文

前言

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

核心类和接口 BootstrapContext

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

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

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

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

BootstrapRegistry

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

可以看到该接口的方法,都是用于注册。

DefaultBootstrapContext

DefaultBootstrapContext实现了BootstrapRegistry和BootstrapContext接口,他们都是由Spring Boot 自己提供了接口。

可以看到,DefaultBootstrapContext就是一个简单的IOC 容器,实现了注册 Bean 和获取Bean 的一些方法。

只所以设计一个引导的思想,就是因为在刚开始启动阶段,而这时候应用的IOC 容器并没有创建好,就用要这个引导上下文去完成一些初始化的操作。

BootstrapRegistryInitializer

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

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

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

@FunctionalInterface
public interface BootstrapRegistryInitializer {

	void initialize(BootstrapRegistry registry);
}
创建引导上下文

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

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

createBootstrapContext()只有两步:

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

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

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

bootstrapRegistryInitializers集合中,这里没有找到实例,所有也没有进一步操作。

最终,经过简单的步骤,DefaultBootstrapContext 对象就常见成功了,实际查看,发现该类没有什么东西:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992215.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号