目录
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启动原理)
给个三连吧 谢谢谢谢谢谢了