springboot运行流程,主要集中在
springApplication.class
这个类中,我们可以通过springboot启动类调用的springApplication.run()方法为起点,粗略的阅读源码,下文为流程粗略纪要,读者可以根据纪要阅读一遍。
一、new SpringApplication,执行initialize()方法
1)、判断是否是web环境
2)、加载所有classpath目录下META-INF/spring.factories配置文件中的ApplicationContextInitializer
3)、加载所有classpath目录下META-INF/spring.factories配置文件中的ApplicationListener
4)、推断main方法所在的类
二、执行run方法
1)设置java.awt.headless系统变量
2)加载所有classpath目录下META-INF/spring.factories配置文件中的SpringApplicationRunListener
3)执行所有SpringApplicationRunListener的started方法
4)实例化ApplicationArguments对象
5)创建environment
6)配置environment,主要是把run方法配置到environment
7)执行所有SpringApplicationRunListener的environmentPrepared方法
8)如果不是webEnvironment,且有必要,则把当前Environment转换为标准的Environment
9)初始化ApplicationContext,如果是web Environment,则实例化org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext
否则实例化org.springframework.context.annotation.AnnotationConfigApplicationContext
10)如果beanNameGenerator不为空,就把beanNameGenerator对象注入到context中
11)回调所有的ApplicationContextInitializer
12)执行所有SpringApplicationRunListener的contextPrepared方法
13)依次往spring容器中注入ApplicationArguments、Banner
14)加载所有的源到context中(源即为springboot项目的启动类)
15)执行所有SpringApplicationRunListeners的contextLoaded方法
16)执行applicationContext的refresh方法,并且调用ApplicationContext.registerShutdownHook()方法
17)回调,获取容器中所有的ApplicationRunner、CommandLineRunner对象,然后排序、依次调用
18)执行SpringApplicationRunListeners.finished方法,结束所有的监听
19)结束启动计时,如果启动状态异常,打印日志
建议读者先阅读我的前几篇Spring-boot事件监听和源码分析、spring-boot ApplicationContextInitializer实现与使用、spring-boot CommandLineRunner、ApplicationRunner实现与使用文章,阅读后就能理解他们执行的先后顺序啦~