• 【日积月累】SpringBoot启动流程


    主图==========

    目录


    文章所属专区 日积月累


    1.前言

    SpringBoot启动流程,一个容易被忽略的问题,包含非常多的知识。主要分为两部
    1.构造一个SpringApplication的实例,完成初始化工作
    2.SpringApplication实例构造完之后调用run方法,启动SpringApplication

    2.构造一个SpringApplication的实例,完成初始化的工作

    1. 创建并初始化ApplicationInitializer,设置到initializers属性中 。
    2. 创建并初始化ApplicationListener,设置到listeners属性中 。

    SpringApplication实例构造完之后调用run方法,启动SpringApplication

    1. 创建并初始化计时器StopWatch,用来记录SpringBoot的启动时间 。
    2. 创建并初始化监听器SpringApplicationRunListeners,并启动监听,用于监听run方法的执行。
    3. 创建并初始化ApplicationArguments,获取run方法传递的args参数。
    4. 创建并初始化环境配置ConfigurableEnvironment。封装main方法的参数,写入到 Environment中,发布 ApplicationEnvironmentPreparedEvent(环境事件)。

    3.SpringBoot启动代码

    每个SpringBoot程序都有一个主入口,也就是main方法,main方法里面调用SpringApplication.run()启动整个SpringBoot程序,该方法所在类需要使用***@SpringBootApplication***注解,这个类实际可以看做是由@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan 三个注解组成

    在这里插入图片描述

    @SpringBootConfiguration

    实际上就是一个@Configuration ,它的作用是把当前类作为一个配置类交给Spring中的IOC容器进行管理。

    @ComponentScan

    用于定义Spring扫描的路径,等价于在xml中配置 context:component-scan,如果不配置扫描路径,则默认扫描当前类所在的包以及子包中标注了@Controller @Service @Component等注解的类

    @EnableAutoConfiguration

    是实现自动装配的关键。它是由@AutoConfigurationPackage 和@Import组成的复合注解

    总结

    1、调用有@SpringBootApplication注解的启动类的main方法
    2、通过调用SpringApplication内部的run()方法构建SpringApplication对象。
    创建SpringApplication对象:
    2.1 PrimarySources 不为空,将启动类赋值给primarySources 对象。
    2.2 从classpath类路径推断Web应用类型,有三种Web应用类型NONE、SERVLET、REACTIVE
    2.3 初始化bootstrapRegistryInitializers
    2.4 初始化ApplicationContextInitializer集合
    2.5 初始化ApplicationListener
    2.6 获取StackTraceElement数组遍历,通过反射获取堆栈中有main方法A的。
    3、调用SpringBootApplication的run方法。
    4、long startTime = System.nanoTime(); 记录项目启动时间。
    5、通过BootstrapRegistryInitializer来初始化DefaultBootstrapContext
    6、getRunListeners(args)获取SpringApplicationRunListeners监听器
    7、 listeners.starting()触发ApplicationStartingEvent事件
    8、prepareEnvironment(listeners, bootstrapContext, applicationArguments) 将配置文件读取到容器中,返回ConfigurableEnvironment 对象。
    9、printBanner(environment) 打印Banner图,即SpringBoot启动时的图案。
    10、根据WebApplicationType从ApplicationContextFactory工厂创建ConfigurableApplicationContext,并设置ConfigurableApplicationContext中的ApplicationStartup为DefaultApplicationStartup
    11、 调用prepareContext()初始化context等,打印启动日志信息,启动Profile日志信息,并为BeanFactory中的部分属性赋值。
    12、刷新容器,在该方法中集成了Tomcat容器
    13、加载SpringMVC.
    14、刷新后的方法,空方法,给用户自定义重写afterRefresh()
    15、Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime)算出启动花费的时间。
    16、打印日志Started xxx in xxx seconds (JVM running for xxxx)
    17、listeners.started(context, timeTakenToStartup)触发ApplicationStartedEvent事件监听。上下文已刷新,应用程序已启动。
    18、调用ApplicationRunner和CommandLineRunner
    19、返回上下文。

    参考

    一文搞懂SpringBoot启动流程及自动配置
    SpringBoot启动流程详细介绍
    SpringBootApplication详解(Spring Boot启动原理)

    给个三连吧 谢谢谢谢谢谢了
    在这里插入图片描述

  • 相关阅读:
    C++,内联函数、对象、类、this
    【汇总的汇总】内容索引
    第3章 并发编程
    【Hadoop】hive工具使用的两种方式
    Spring Boot技术知识点:Spring Boot2.7以上支持使用Swagger3
    基础算法练习200题12、统计奇偶数
    RPA-2 之B/S第一讲:selenium驱动下载与安装
    DNS域名解析
    SpringBoot+Redis实现接口幂等性,就看这篇了
    1024程序员节|基于Springboot实现爱心捐赠管理系统
  • 原文地址:https://blog.csdn.net/qq_43238568/article/details/132889721