SpringBoot启动流程机制

Spring boot启动原理及相关组件 ConfigurationClassPostProcessor的优先级为最高,它会对项目中的@Configuration注解修饰的类(@Component、@ComponentScan、@Import、@ImportResource修饰的类也会被处理)进行解析,解析完成之后把这些bean注册到BeanFactory中。在github里,我把Spring Boot应用启动的拓展组件(自定义的应用初始器、监听器、事件、ApplicationRunner)都写了例子,可参照阅读。 阅读详情

引言

对于Java语言中最流行的项目脚手架SpringBoot,相信很多程序员都和之前的我一样停留在会用却说不出它的启动流程的阶段,每次去好一点的甲方公司面试一旦面试官问到SpringBoot的详细启动流程是什么时都会很懵圈,大部分没有研究过SpringBoot框架源码的的小伙伴99%是答不上来的,然后面试官一句回去等消息吧直接凉凉。那么本文就带领还没有研究过SpringBoot框架源码的小伙伴们来捋一捋SpringBoot应用的启动流程机制。

1 SpringBoot启动的流程总览

每一个SpringBoot程序都有一个主入口,这个主入口就是main方法,而main方法中都会调用SpringBootApplication.run方法,一个快速了解SpringBootApplication启动过程的好方法就是在run方法中打一个断点,然后通过Debug的模式启动工程,逐步跟踪了解SpringBoot源码是如何完成环境准备和启动加载bean的。

查看SpringBootApplication.run方法的源码就可以发现SpringBoot启动的流程主要分为两大阶段:

初始化SpringApplication运行SpringApplication

运行SpringApplication的过程

其中运行SpringApplication的过程又可以细分为以下几个部分:

1)SpringApplicationRunListeners 引用启动监控模块

2)ConfigrableEnvironment配置环境模块和监听:包括创建配置环境、加载属性配置文件和配置监听

3)ConfigrableApplicationContext配置应用上下文:包括配置应用上下文对象、配置基本属性和刷新应用上下文

2 初始化SpringApplication

步骤1进行SpringApplication的初始化,配置基本的环境变量、资源、构造器、监听器,初始化阶段的主要作用是为运行SpringApplication实例对象启动环境变量准备以及进行必要的资源构造器的初始化动作,代码如下:

public SpringApplication(ResourceLoader resourceLoader, Object... sources){
    this.resourceLoader = resourceLoader;
    initialize(source);
}

@SupressWarnings({"unchecked","rowtypes"})
private void initialize(Object[] sources){
    if(sources != null && sources.length > 0){
        this.sources.addAll(Arrays.asList(sources));
    }
    this.WebEnvironment = deduceWebEnvironment;
    setInitiallizers((Collection) getSpringFactoriesInstances(ApplicationContextInitiallizer.class));
    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = deduceMainApplicationClass();
}

SpringApplication方法的核心就是this.initialize(sources)初始化方法,SpringApplication通过调用该方法完成初始化工作。deduceWebEnvironment方法用来判断当前应用的环境,该方法通过获取两个类来判断当前环境是否是Web环境。而getSpringFactoriesInstances方法主要用来从spring.factories文件中找出Key为ApplicationContextInitiallizer的类并实例化,然后调用setInitiallizer方法设置到SpringApplication的initiallizer属性中,找到它所有应用的初始化器。接着调用setListener方法设置应用监听器,这个过程可以找到所有应用程序的监听器,然后找到应用启动主类名称。

3 运行SpringApplication

SpringBoot正式启动加载过程,包括启动流程监控模块、配置环境加载模块、ApplicationContext容器上下文环境加载模块。refreshContext方法刷新应用上下文并进行自动化配置模块加载,也就是上文提到的SpringFactoriesLoader根据指定classpath加载META-INF/spring.factories文件的配置,实现自动配置核心功能。运行SpringApplication的主要代码如下:

public ConfigurableApplicationContext run(String... args) {
    ConfigurableApplicationContext context = null;
    FailureAnalyzer analyzer = null;
    configureHeadlessProperty();
    // 步骤1
    SpringApplicationRunListeners listeners = getRunListeners(args);
        listeners.starting();
    try{
        // 步骤2
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
        ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
        Banner printBanner = printBanner(environment);
        // 步骤3
        context = createApplicationContext();
        prepareContext(context, environment, listeners, applicationArguments, printBanner);
        refreshContext(context);
        afterRefresh(context, applicationArguments);
        listeners.finished(context, null);
        // 省略
        return context;
    }
}
3.1 SpringApplciationRunListener应用启动监控模块

应用启动监控模块对应上述源码中的注释步骤1到步骤2之间的两行代码,它创建了应用的监听器SpringApplicationRunListeners并开始监听,监控模块通过调用getSpringFactoriesInstances私有协议从META-INF/spring.factories文件中取得SpringApplicationRunListener监听器实例。

当前事件监听器SpringApplicationRunListener中只有一个EventPublishingRunlistener广播事件监听器,它的starting方法会封装成SpringApplicatiionEvent事件广播出去,被SpringApplication中配置的listener监听。这一步骤执行完成后也会同时通知SpringBoot其他模块目前监听初始化已经完成,可以开始执行启动方案了。

3.2 ConfigurableEnviroment 配置环境模块和监听

对应上述源码注释中的步骤2到步骤3之间的几行代码,下面分解步骤说明:

(1) 创建配置环境,创建应用程序的环境信息。如果是Web程序,创建StandardServletEnvironment;否则创建StandardEnviroment;

(2) 加载属性配置文件,将配置文件加入监听器对象中(SpringApplicationRunListeners)。通过configPropertySource方法设置properties配置文件,通过执行configProfies方法设置profiles;

(3) 配置监听,发布environmentPrepared事件,及调用ApplicationListener#onApplicationEvent方法,通知SpringBoot应用的environment已经准备完成。

3.3 ConfigurableApplicationContext配置应用上下文

对应源码中的步骤3下面的几行代码,下面分解步骤说明:

(1)配置Spring容器应用上下文对象,它的作用是创建Run方法的返回对象ConfigurableApplicationContext(应用配置上下文),此类主要继承了ApplicationLifeCycle、Closeable接口,而ApplicationContext是Spring框架中负责Bean注入容器的主要载体,负责bean加载、配置管理、维护bean之间依赖关系及Bean生命周期管理。

(2)配置基本属性,对应prepareContext方法将listener、environment、banner、applicationArguments等重要组件与Spring容器上下文对象关联。借助SpringFactoriesLoader查找可用的ApplciationContextInitailizer, 它的initialize方法会对创建好的ApplicationContext进行初始化,然后它会调用SpringApplicationRunListener#contextPrepared方法,此时SpringBoot应用的ApplicationContext已经准备就绪,为刷新应用上下文准备好了容器。

(3)刷新应用上下文,对应源码中的refreshContext(context)方法将通过工程模式产生应用上下文中所需的bean。实现spring-boot-starter-*(mybatis、redis等)自动化配置的关键,包括spring.factories的加载、bean的实例化等核心工作。然后调用SpringApplicationRunListener#finish方法告诉SprignBoot应用程序,容器已经完成ApplicationContext装载。

4 小结

SpringBoot应用程序的启动流程主要包括初始化SpringApplication和运行SpringApplication两个过程。其中初始化SpringApplication包括配置基本的环境变量、资源、构造器和监听器,为运行SpringApplciation实例对象作准备;而运行SpringApplication实例为应用程序正式启动加载过程,包括SpringApplicationRunListeners 引用启动监控模块、ConfigrableEnvironment配置环境模块和监听及ConfigrableApplicationContext配置应用上下文。当完成刷新应用的上下文和调用SpringApplicationRunListener#contextPrepared方法后表示SpringBoot应用程序已经启动完成。

PHP项目实战:易宝支付SDK对接全流程(含回调处理与常见问题排查) 本文详细介绍了PHP项目中易宝支付SDK的对接全流程,包括环境准备、SDK配置、支付请求构建与发起、回调处理实战以及常见问题排查。特别针对回调处理环节的常见问题提供了解决方案,帮助开发者快速完成支付对接并优化性能。 阅读详情

相关推荐

FreeRTOS的学习(十四)——PendSV异常

本文将从任务切换的角度出发,学习PendSV异常的相关概念。

LEOD的博客 1730

Spring Boot 启动过程与自动配置详解:从源码到实现

分析SpringBoot启动配置原理:给出整体初步分析和对应流程图,并从三方面进行展开分析(SpringApplication构造过程分析+SpringApplication启动过程分析+SpringBoot自动配置分析)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

VMware ESXi 7.0下Intel网卡SR-IOV配置实战:解决虚拟化网络延迟问题

本文详细介绍了在VMware ESXi 7.0环境下为Intel网卡配置SR-IOV(单根I/O虚拟化)的完整实战流程。通过硬件辅助直通技术,虚拟机可直接访问物理网卡资源,有效绕过虚拟化层瓶颈,从而显著降低网络延迟和CPU开销,适用于金融交易、实时计算等对性能敏感的场景。

embedding5hiker的博客 553

Spring Boot 的启动过程解析

Spring Boot 的入口是一个主要的配置类,通常是带有 @SpringBootApplication 注解的类。在启动过程中,Spring Boot 首先会加载这个配置类。SpringApplication 是 Spring Boot 的核心类,用于启动应用和初始化 Spring 环境。它负责创建和配置 Spring 应用上下文,加载自动配置,执行初始化和刷新等操作。让我们以 SpringApplication 类为例进行源码分析。

yuanchengfu0910的博客 1243

GEE入门之路(从【初学者】角度,大白话)——附海面风速插值代码

非常初级的GEE入门教程!大白话!有手就行!附海面风速插值代码,克里金插值,时间插值。

weixin_46812066的博客 4086

Doris副本修复实战:从状态机到手动修复的完整指南

在分布式数据库系统中,多副本机制是实现高可用与数据一致性的核心技术。其原理是通过在不同节点存储数据的多个拷贝,确保部分节点故障时服务仍可继续。这项技术的核心价值在于保障数据可靠性,并支撑在线分析处理(OLAP)等对数据一致性要求高的应用场景。当副本出现损坏、丢失或版本不一致时,系统通常依赖自动修复机制,但在元数据损坏、多副本同时故障等复杂场景下,自动修复可能失效,需要深入理解副本状态机并借助手动工具介入。本文将聚焦Doris数据库,解析Tablet副本状态流转(如BAD、VERSION_ERROR),并详细

weixin_32288959的博客 461

SpringBoot启动原理

第三个问题是传统的web容器比如jetty本质上是直接通过java start.jar 来启动,之后来加载spring上下文的,SpringBoot通过main函数是怎么来启动web容器。2> 传统的web容器比如jetty本质上是直接通过java start.jar 来启动,之后来加载spring上下文的,SpringBoot通过main函数是怎么来启动web容器的呢?即:带着问题去看,debug跟踪源码验证 的方法。文本用带有少许说明的三个问题开场展开论述,实际是使用了麦肯锡大法中的SCQA架构。

qq_38470315的博客 1049

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

qq_36773158的博客 4646

Spring Boot 启动原理完整解析

通过对 Spring Boot 启动过程的详细解析,我们不仅可以深入理解 Spring Boot 的工作原理,还能学习到各种设计模式的实际应用。在面试中,Spring Boot 的启动原理是常见的考察点,掌握这些内容能够帮助我们更好地应对面试,并在实际开发中灵活运用。

Randy的博客 2460

UNITY3D万人同屏,Dots万人同屏解决方案_类萌宠宠之战

UNITY3D弹幕游戏开发,万人同屏解决方案

6472

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型

一、本文介绍 本文记录的是基于 GhostNetV3 的 YOLOv11 轻量化改进方法研究。GhostNetV3的轻量模块采用重参数化方法,训练时为深度可分离卷积和1×1卷积添加线性并行分支,推理时通过逆重参数化移除分支、折叠操作,能够在不增加推理成本的同时提高性能,从而实现YOLOv11的轻量化改进。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进 专栏地址:YOLOv11改进专栏——以发表论文的角度,快速

Limiiiing的博客 1845

实战:SpringBoot启动流程中的扩展机制解析

通过深入分析ApplicationContextInitializer和ApplicationListener接口,以及自定义SpringApplicationRunListener,我们可以看到SpringBoot启动流程中的强大扩展机制。在本篇文章中,我们将进一步分析SpringBoot启动流程中的扩展机制,特别是ApplicationContextInitializer和ApplicationListener,并展示如何自定义这些组件来扩展SpringBoot的功能。

为无为,事无事,味无味。 1075

第四章节 Qt字符串QString详解

QString 的使用方式和 C++标准库的 std::string 字符串的非常相似。

m0_65635427的博客 890

Spring Boot 启动流程深度解析:从 SpringApplication 到事件广播机制

本文深度解析了Spring Boot的启动流程,重点剖析了SpringApplication类的构造与run()方法执行过程。启动流程包含12个关键步骤,从环境准备到上下文创建与刷新,最终完成容器初始化。核心机制包括通过spring.factories加载扩展组件,以及通过EventPublishingRunListener实现的事件驱动架构,支持在启动各阶段发布事件并触发监听逻辑。文章还演示了如何通过自定义监听器和初始化器实现启动过程的扩展控制,为深入理解Spring Boot启动原理和问题排查提供了系统

刘一说的IT专栏 1190

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

《揭秘SpringBoot启动流程核心机制》

在日常开发中,我们只需编写一个标注@SpringBootApplication的启动类,调用SpringApplication.run()方法就能启动一个 Spring Boot 应用。但这行简单代码背后,隐藏着复杂且完整的启动流程 —— 从初始化应用上下文,到自动配置生效,再到最终容器就绪。追踪 SpringApplication.run() 源码,会发现它先通过重载方法完成。三.SpringApplication.run()实例方法。实例初始化完成后,会调用run(args)方法。

m0_74162426的博客 520

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring Boot 启动流程与重要的回调机制

说明: 以下使用的是 Spring Boot 2.0.4 版本 几个重要的事件回调机制 配置在META-INF/spring.factories ApplicationContextInitializer SpringApplicationRunListener 和放在ioc容器中 ApplicationRunner CommandLineRunner # Initializers org.spr...

yangfanor的专栏 836

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SpringBoot启动流程深度解析:从入口到容器就绪的完整机制

除了默认的文件,还可以通过})// ...SpringBoot的启动流程是一个精心设计的复杂过程,它巧妙地将Spring框架的复杂性和繁琐配置隐藏起来,为开发者提供了简单高效的开发体验。从注解的扫描开始,到配置文件的加载、Spring容器的创建、自动配置的执行,再到内嵌Web服务器的启动,每一步都体现了SpringBoot"约定优于配置"的设计哲学。理解这个完整流程不仅能帮助我们更好地使用SpringBoot,还能在遇到问题时快速定位到具体环节。

用文字记录技术,用分享回馈社区,用坚持见证成长 1403

Spring Boot 自动配置原理深度解析:从启动流程到监听机制

通过源码分析揭示了SpringBoot自动装配和启动过程中的关键设计,包括延迟导入、事件驱动等机制,为理解SpringBoot内部原理提供了深入视角。

qq_74092815的博客 776

SpringBoot启动流程与配置类处理机制详解, 附源码与思维导图

纯干货无废话, 附源码与思维导图

wdx7770的博客 1077

详细分析 Spring Boot 的启动流程,其内部机制和关键组件是怎样的?

Spring Boot 是一个强大且易于使用的框架,可以帮助开发人员快速构建和部署企业级应用程序和微服务。它基于 Spring 框架,利用自动配置和内嵌服务器等机制,可以大大简化开发和部署过程。在使用 Spring Boot 时,开发人员需要了解其基本架构、启动流程、自动配置机制和内嵌服务器的原理,并了解其优缺点。这将有助于开发人员更好地使用 Spring Boot 并优化代码。

网络技术联盟站 299

SpringBoot源码学习之路(十六、启动原理(运行流程分析、自定义事件监听回调机制)))

运行流程分析、自定义事件监听回调机制 一、运行流程分析 1、启动流程: 首先观察SpringBoot启动类源码: SpringApplication.run(SpringbootDemoApplication.class, args); //进入run方法===》发现: public static ConfigurableApplicationContext ru...

.... 永远年轻,永远热泪盈眶 1万+

Spring Boot类加载机制与启动流程的实战优化指南

本文深入剖析了Spring Boot应用启动缓慢的根源,聚焦于类加载机制与启动流程两大核心。通过解析LaunchedURLClassLoader的工作方式、Bean初始化阶段及自动配置成本,提供了依赖治理、懒加载策略、JVM调优及Spring Context Indexer等实战优化方案,旨在帮助开发者系统性提升应用启动速度。

weixin_29196891的博客 227

SpringBoot笔记——原理相关(自动配置、监听机制、启动流程分析)

SpringBoot中提供了很多Enable开头的注解,这些注解都是用于动态启用某些功能的。而其底层原理是使用@Import注解导入一些配置 类,实现Bean的动态加载。:SpringBoot的web环境中默认使用tomcat作为内置服务器,其实SpringBoot中提供了4中内置服务器供我们选择。:时Spring 4.0增加的条件判断功能,通过这个可以实现选择性的创建Bean操作。SpringBoot 的监听机制,其实是对Java提供的事件监听机制的封装。

Z__XY_的博客 946

2.SpringBoot框架启动流程之Spi机制

ConfigurationClassParser内部类DeferredImportSelectorHandler & DeferredImportSelectorGroupingHandler。

qq_36851469的博客 1198

SpringBoot 源码分析四:启动流程中的扩展机制

通过深入分析ApplicationContextInitializer和ApplicationListener接口,以及自定义SpringApplicationRunListener,我们可以看到SpringBoot启动流程中的强大扩展机制。在本篇文章中,我们将进一步分析SpringBoot启动流程中的扩展机制,特别是ApplicationContextInitializer和ApplicationListener,并展示如何自定义这些组件来扩展SpringBoot的功能。

八戒的博客 1236

SpringBoot系列 启动流程

下面记录SpringBoot的启动流程

vonlinee的博客 1623
上一篇: dom4j+xpath解析xml文件
UID_UUID
博客等级 码龄5年 352粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值