https://zhuanlan.zhihu.com/p/136708974
这张图简直不要太简便,感谢博主
总结:
1.执行main()方法后,运行SpringBootApplication.run
2.创建SpringBootApplication对象。创建对象时主要做了四步,判断当前项目是否是web项目,
加载所有可用的初始化器,设置所有可用程序监听器,推断并设置main方法的定义类。
3.执行run()方法
①启动任务执行的时间监听器
②headless系统属性设置
③ 通过SpringFactoriesLoader,获取到所有META-INF/spring.factories下的SpringApplicationRunListeners并实例化,启动已准备好的监听器,监听SpringBoot应用的启动。
④ 创建并配置当前SpringBoot应用将要使用的Environment,包括当前有效的PropertySource以及Profile。
⑤遍历调用所有的SpringApplicationRunListeners的environmentPrepared()的方法,通知这些监听器SpringBoot应用的Environment已经完成初始化。
⑥打印SpringBoot应用的banner,SpringApplication的showBanner属性为true时,如果classpath下存在banner.txt文件,则打印其内容,否则打印默认banner。
⑦根据启动时设置的applicationContextClass和在initialize方法设置的webEnvironment,创建对应的applicationContext。
⑧创建异常解析器,用在启动中发生异常的时候进行异常处理(包括记录日志、释放资源等)。
⑨设置SpringBoot的Environment,注册Spring Bean名称的序列化器BeanNameGenerator,并设置资源加载器ResourceLoader,通过SpringFactoriesLoader加载ApplicationContextInitializer初始化器,调用initialize方法,对创建的ApplicationContext进一步初始化。
⑩调用所有的SpringApplicationRunListeners的contextPrepared方法,通知这些Listener当前ApplicationContext已经创建完毕。
a.最核心的一步,将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。
b.调用所有的SpringApplicationRunListener的contextLoaded方法,加载准备完毕的ApplicationContext。
c.调用refreshContext,注册一个关闭Spring容器的钩子ShutdownHook,当程序在停止的时候释放资源(包括:销毁Bean,关闭SpringBean的创建工厂等)