
目录
 
SpringBoot启动流程
- 1.前言
- 2.构造一个SpringApplication的实例,完成初始化的工作
- SpringApplication实例构造完之后调用run方法,启动SpringApplication
- 3.SpringBoot启动代码
- @SpringBootConfiguration
- @ComponentScan
- @EnableAutoConfiguration
 
- 总结
- 参考
文章所属专区 日积月累
1.前言
SpringBoot启动流程,一个容易被忽略的问题,包含非常多的知识。主要分为两部
 1.构造一个SpringApplication的实例,完成初始化工作
 2.SpringApplication实例构造完之后调用run方法,启动SpringApplication
2.构造一个SpringApplication的实例,完成初始化的工作
- 创建并初始化ApplicationInitializer,设置到initializers属性中 。
- 创建并初始化ApplicationListener,设置到listeners属性中 。
SpringApplication实例构造完之后调用run方法,启动SpringApplication
- 创建并初始化计时器StopWatch,用来记录SpringBoot的启动时间 。
- 创建并初始化监听器SpringApplicationRunListeners,并启动监听,用于监听run方法的执行。
- 创建并初始化ApplicationArguments,获取run方法传递的args参数。
- 创建并初始化环境配置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启动原理)
给个三连吧 谢谢谢谢谢谢了
 



















