springboot的启动流程;
总体来说,分为两个核心步骤
1,创建SpringApplication对象
2,SpringApplication的run方法实现启动同时返回当前容器的上下文对象
分析一下详细的流程;
1,创建SpringApplication对象,指定springboot容器初始化操作
构造函数内容:
2,获取当前应用启动类型
原理:判断当前classpath是否有加载我们的servlet类,返回servlet web的启动方式
webApplicationType分为三种类型:
1,REACTIVE 响应式启动(spring5新特性)
2,NONE 不会嵌入web容器启动 (在将springboot项目放入外部服务器运行的时候使用,可以在application.yml中配置)
3,SERVLET 基于web容器启动 (嵌入式web容器,由java语言创建)
3,setlnitializers读取Spr ingBoot包下面的META- |NF/spring. factories获取到对应Appl icat ionContext Initializer装配到集合中,一共是6个
4,setListeners 读取SpringBoot包下面的META- INF/spring.factories获取到对应ApplicationListener装配到集合中
5,mainApplicationClass获取当前运行的主函数
6,调用SpringApplication的run方法实现启动
run方法内容:
7,StopWatch stopWatch = new StopWatch();
stopWatch.start();
.....
stopWatch.stop();
记录springboot项目启动时间
8,getRunListeners(args)读取所有包里面的META-INF/spring.factories文件中的SpringApplicationRunListener类型存入到集合中
9,listeners.starting();循环执行集合中所有项的starting方法
10,ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
读取配置文件到springboot容器中
11,Banner printedBanner = printBanner(environment);
打印Banner图
12,context = createApplicationContext();
点击进入这个方法可以看到是判断webApplicationType类型
servlet类型,创建AnnotationConfigServletWebServerApplicationContext对象
13,refreshContext(context); 刷新上下文
14,开始创建tomcat容器
15,开始加载SpringMVC
16,afterRefresh(context, applicationArguments);
一个空的模板方法,可以供子类重写
17,listeners.started(context);
使用广播和回调机制通知监听器springboot容器已经启动成功
18,listeners.running(context);
使用广播和回调机制通知监听器springboot容器已经启动成功,可以正常运行项目
19,最后返回当前上下文对象