【Spring Boot 源码学习】BootstrapRegistryInitializer 详解

这篇具有很好参考价值的文章主要介绍了【Spring Boot 源码学习】BootstrapRegistryInitializer 详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

《Spring Boot 源码学习系列》

【Spring Boot 源码学习】BootstrapRegistryInitializer 详解,开发框架-Spring Boot,spring boot,源码学习,Bootstrap注册表

一、引言

书接前文《初识 SpringApplication》,我们从 Spring Boot 的启动类 SpringApplication 上入手,了解了 SpringApplication 实例化过程。其中,有如下三块内容还未详细分析:
【Spring Boot 源码学习】BootstrapRegistryInitializer 详解,开发框架-Spring Boot,spring boot,源码学习,Bootstrap注册表
本篇博文就主要围绕 2.3 的内容展开,详细分析一下加载并初始化 BootstrapRegistryInitializer 及其相关的类的逻辑。

【Spring Boot 源码学习】BootstrapRegistryInitializer 详解,开发框架-Spring Boot,spring boot,源码学习,Bootstrap注册表

二、往期内容

在开始本篇的内容介绍之前,我们先来看看往期的系列文章【有需要的朋友,欢迎关注系列专栏】:

Spring Boot 源码学习
Spring Boot 项目介绍
Spring Boot 核心运行原理介绍
【Spring Boot 源码学习】@EnableAutoConfiguration 注解
【Spring Boot 源码学习】@SpringBootApplication 注解
【Spring Boot 源码学习】走近 AutoConfigurationImportSelector
【Spring Boot 源码学习】自动装配流程源码解析(上)
【Spring Boot 源码学习】自动装配流程源码解析(下)
【Spring Boot 源码学习】深入 FilteringSpringBootCondition
【Spring Boot 源码学习】OnClassCondition 详解
【Spring Boot 源码学习】OnBeanCondition 详解
【Spring Boot 源码学习】OnWebApplicationCondition 详解
【Spring Boot 源码学习】@Conditional 条件注解
【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解
【Spring Boot 源码学习】RedisAutoConfiguration 详解
【Spring Boot 源码学习】JedisConnectionConfiguration 详解
【Spring Boot 源码学习】初识 SpringApplication
【Spring Boot 源码学习】Banner 信息打印流程
【Spring Boot 源码学习】自定义 Banner 信息打印

三、主要内容

注意: 以下涉及 Spring Boot 源码 均来自版本 2.7.9,其他版本有所出入,可自行查看源码。

3.1 初识 BootstrapRegistryInitializer

废话不多说,我们直接来看 BootstrapRegistryInitializer 接口的源码:

@FunctionalInterface
public interface BootstrapRegistryInitializer {
	void initialize(BootstrapRegistry registry);
}

阅读上述代码,可以看到 BootstrapRegistryInitializer 接口被 @FunctionalInterface 注解修饰。

@FunctionalInterfaceJava 8 中引入的一个注解,用于标识一个函数式接口。函数式接口是只有一个抽象方法的接口,常用于实现 Lambda 表达式和方法引用。
使用 @FunctionalInterface 注解可以向编译器指示该接口是一个函数式接口,从而在编译时进行类型检查,确保该接口 只包含一个抽象方法。此外,该注解还可以为函数式接口生成特殊的方法,如默认方法(default method)和 静态方法(static method),这些方法可以在接口中提供更多的功能,这里就不赘述了,感兴趣的朋友可以自行查阅相关函数式接口的资料。

BootstrapRegistryInitializer 接口只定义了一个 initialize 方法,该方法只有一个参数是 BootstrapRegistry

BootstrapRegistry 是一个简单的对象注册表,它在启动和环境后处理期间都可用,直到ApplicationContext 准备好为止。它可用于注册可能创建成本较高或在 ApplicationContext 可用之前需要共享的实例。它的一个默认实现是 DefaultBootstrapContext ,后面我们会看到。

注册表使用 Class 作为键,这意味着每个给定类型只能存储一个实例。

addCloseListener(ApplicationListener) 方法可用于添加监听器,当 BootstrapContext 已关闭并且 ApplicationContext 完全准备好时,该监听器可以执行操作。例如,一个实例可能选择将自己注册为常规的 Spring bean,以便应用程序可以使用它。

简而言之,BootstrapRegistry 是一个用于存储和共享对象的注册表,这些对象在ApplicationContext 准备好之前就可能已经被创建并需要被共享。

Spring Cloud Config 中,客户端通过向配置中心(Config Server)发送请求来获取应用程序的配置信息。而 BootstrapRegistryInitializer 就是负责将配置中心的相关信息注册到 Spring 容器中的。

3.2 加载 BootstrapRegistryInitializer

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

上述代码是 SpringApplication 的核心构造方法中的逻辑,它用于加载实现了 BootstrapRegistryInitializer 接口的类的实例集合。

我们进入 getSpringFactoriesInstances 方法,查看如下:

【Spring Boot 源码学习】BootstrapRegistryInitializer 详解,开发框架-Spring Boot,spring boot,源码学习,Bootstrap注册表

我们看到了如下的代码 :

SpringFactoriesLoader.loadFactoryNames(type, classLoader);

这里是通过 SpringFactoriesLoader 类的 loadFactoryNames 方法来获取 META-INF/spring.factories 中配置 key 为 org.springframework.boot.BootstrapRegistryInitializer 的数据;

当然这些配置不在 Spring BootMETA-INF/spring.factories 中,我们上面提到 Spring Cloud Config 就是用 BootstrapRegistryInitializer 将配置中心的相关信息注册到 Spring 容器中,那我们就来看看 Spring Cloud Config 相关的配置。

如下是 Spring Cloud ConfigStarter 依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
    <version>4.0.4</version>
</dependency>

导入上述依赖之后,相关的 META-INF/spring.factories 配置,我们发现是在如下的 jar 包里面【spring-cloud-config-client-4.0.4.jar】:

【Spring Boot 源码学习】BootstrapRegistryInitializer 详解,开发框架-Spring Boot,spring boot,源码学习,Bootstrap注册表

查看 META-INF/spring.factories 配置文件,我们可以看到如下:

【Spring Boot 源码学习】BootstrapRegistryInitializer 详解,开发框架-Spring Boot,spring boot,源码学习,Bootstrap注册表

# Spring Boot BootstrapRegistryInitializers
org.springframework.boot.BootstrapRegistryInitializer=\
org.springframework.cloud.config.client.ConfigClientRetryBootstrapper

有关 Spring Cloud Config 的内容,这里就不展开介绍了,感兴趣的小伙伴自行查阅 Spring Cloud Config 的官方文档。

3.3 BootstrapRegistryInitializer 的初始化

这里我们需要查看 SpringApplicationrun(String... args) 方法,如下所示:

【Spring Boot 源码学习】BootstrapRegistryInitializer 详解,开发框架-Spring Boot,spring boot,源码学习,Bootstrap注册表

在上述的 createBootstrapContext 方法中,就对 BootstrapRegistryInitializer 进行初始化,我们继续往下看:

【Spring Boot 源码学习】BootstrapRegistryInitializer 详解,开发框架-Spring Boot,spring boot,源码学习,Bootstrap注册表

从上图中,我们可以看到这样一行代码:

this.bootstrapRegistryInitializers.forEach((initializer) -> initializer.initialize(bootstrapContext));

这里涉及如下的知识点:

  • this.bootstrapRegistryInitializers.forEach() : Java 8Stream API,它用于遍历列表中的每个元素,并执行给定的操作【即 initializer.initialize(bootstrapContext) 】。
  • (initializer) -> initializer.initialize(bootstrapContext)Lambda 表达式,这是 Java 8 引入的一个新特性,允许以更简洁的方式表示匿名方法。它表示一个接受BootstrapRegistryInitializer 类型参数 initializer,并调用其 initialize(bootstrapContext) 方法的功能。

简而言之,对于 this.bootstrapRegistryInitializers 列表中的每个 BootstrapRegistryInitializer,使用当前的 bootstrapContext 初始化它。这里的 bootstrapContext 其实就是 BootstrapRegistry 注册表的一个默认实现 DefaultBootstrapContext

从上述的 SpringApplicationrun(String... args) 方法源码中,我们也可以看出 BootstrapRegistryInitializer 的初始化是在 Spring Boot 应用启动一开始进行的。

我们通过实现 BootstrapRegistryInitializer 接口并定义 initialize 方法,可以将自定义的 Bean 初始化器注册到 ApplicationContext 中。这样,在 Spring Boot 应用启动时,这些初始化器会被自动加载并执行,从而完成一些必要的初始化配置。

四、总结

本篇 Huazie 带大家详细分析了加载并初始化 BootstrapRegistryInitializer 的逻辑,这对于后续的 SpringApplication 运行流程的理解至关重要。文章来源地址https://www.toymoban.com/news/detail-758454.html

到了这里,关于【Spring Boot 源码学习】BootstrapRegistryInitializer 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解

    Spring Boot 源码学习系列 前面的博文,我们从源码角度介绍了自动装配流程。虽然带大家从整体上有了清晰的认识,但是我们还不能熟练地运用。本篇就以 Spring Boot 内置的 http 编码功能为例,来带大家分析一下 HttpEncodingAutoConfiguration 的整个自动配置的过程。 在开始本篇的内容

    2024年02月08日
    浏览(38)
  • 【Spring Boot 源码学习】自动装配流程源码解析(上)

    《Spring Boot 源码学习系列》 上篇博文,笔者带大家从整体上了解了AutoConfigurationImportSelector 自动装配逻辑的核心功能及流程,由于篇幅有限,更加细化的功能及流程详解还没有介绍。本篇开始将从其源码入手,重点解析细化后的自动装配流程源码。 在开始本篇的内容介绍之前

    2024年02月14日
    浏览(41)
  • 【Spring Boot 源码学习】自动装配流程源码解析(下)

    《Spring Boot 源码学习系列》 上篇博文,笔者带大家了解了自动装配流程中有关自动配置加载的流程; 本篇将介绍自动装配流程剩余的内容,包含了自动配置组件的排除和过滤、触发自动配置事件。 在开始本篇的内容介绍之前,我们先来看看往期的系列文章【有需要的朋友,

    2024年02月11日
    浏览(36)
  • 【Spring Boot 源码学习】深入 FilteringSpringBootCondition

    Spring Boot 源码学习系列 前两篇博文笔者带大家从源码深入了解了 Spring Boot 的自动装配流程,其中自动配置过滤的实现由于篇幅限制,还未深入分析。 那么从本篇开始,Huazie 就带大家走近 AutoConfigurationImportFilter ,一起从源码解析 FilteringSpringBootCondition 、 OnBeanCondition 、 OnCl

    2024年02月09日
    浏览(40)
  • 【Spring Boot 源码学习】初识 SpringApplication

    《Spring Boot 源码学习系列》 往期的博文, Huazie 围绕 Spring Boot 的核心功能,带大家从总整体上了解 Spring Boot 自动配置的原理以及自动配置核心组件的运作过程。这些内容大家需要重点关注,只有了解这些基础的组件和功能,我们在后续集成其他三方类库的 Starters 时,才能够

    2024年02月05日
    浏览(39)
  • 【Spring Boot 源码学习】走近 AutoConfigurationImportSelector

    《Spring Boot 源码学习系列》 上篇博文我们了解了 @EnableAutoConfiguration 注解,其中真正实现自动配置功能的核心实现者 AutoConfigurationImportSelector 还没有详细说明,本篇将从它的源码入手来重点介绍。 在介绍 AutoConfigurationImportSelector 之前,有必要了解下它所实现的 ImportSelector 接

    2024年02月12日
    浏览(30)
  • 【Spring Boot 源码学习】@Conditional 条件注解

    《Spring Boot 源码学习系列》 前面的博文,Huazie 带大家从 Spring Boot 源码深入了解了自动配置类的读取和筛选的过程,然后又详解了 OnClassCondition 、 OnBeanCondition 、 OnWebApplicationCondition 这三个自动配置过滤匹配子类实现。 在上述的博文中,我们其实已经初步涉及到了像 @Conditi

    2024年02月07日
    浏览(41)
  • 【Spring Boot 源码学习】BootstrapContext的实际使用场景

    《Spring Boot 源码学习系列》 上一篇博文《BootstrapRegistry 初始化器实现》, Huazie 向大家介绍了如何自定义 BootstrapRegistryInitializer 接口实现,并以此来执行自定义的初始化操作【如注册自定义的 Bean 、添加 BootstrapContext 关闭监听器】。其中涉及到了 BootstrapContext 的部分使用场景

    2024年03月11日
    浏览(46)
  • 【Spring Boot 源码学习】SpringApplication 的定制化介绍

    《Spring Boot 源码学习系列》 前面的博文, Huazie 带大家从 Spring Boot 的启动类 SpringApplication 上入手,了解了 SpringApplication 的实例化过程。这实例化构造过程中包含了各种初始化的操作,都是 Spring Boot 默认配置的。如果我们需要定制化配置, SpringApplication 也提供了相关的入口

    2024年01月25日
    浏览(35)
  • java版本企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发

      java版本企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发   一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点

    2024年02月06日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包