【日积月累】SpringBoot启动流程

【日积月累】SpringBoot启动流程_第1张图片

目录

SpringBoot启动流程

  • 1.前言
  • 2.构造一个SpringApplication的实例,完成初始化的工作
  • SpringApplication实例构造完之后调用run方法,启动SpringApplication
  • 3.SpringBoot启动代码
    • @SpringBootConfiguration
    • @ComponentScan
    • @EnableAutoConfiguration
  • 总结
  • 参考


文章所属专区 日积月累


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 三个注解组成

【日积月累】SpringBoot启动流程_第2张图片

@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启动原理)

给个三连吧 谢谢谢谢谢谢了
【日积月累】SpringBoot启动流程_第3张图片

你可能感兴趣的:(日积月累,面试题,spring,boot,java,后端)