注:本系列源码分析基于springboot 2.2.2.RELEASE,对应的spring版本为5.2.2.RELEASE,源码的gitee仓库仓库地址:gitee.com/funcy/sprin….
前面几篇文章分析 springboot 的启动流程,本文来总结下。
文章一开始,从SpringApplication.run(Demo01Application.class, args);代码入手,着重分析了两个方法:
SpringApplication#SpringApplication(...)SpringApplication#run(...)
这两个方法涵盖了springboot启动的整个流程,这里我们逐一总结下 。
SpringApplication#SpringApplication(...)
这个方法的流程如下:
其中,
webApplicationType会在后面决定创建什么类型的applicationContext;Initialzers来自于META-INF/spring.factories,会在 springboot 启动时做一些初始化操作;Listteners同样来自于META-INF/spring.factories,提供了多个方法,可以方便地监听springboot 的执行过程。
SpringApplication#run(...)
这部分的流程如下:
其中,
getRunListener()会获取所有的Listeners,也就是在SpringApplication#SpringApplication(...)中 获取的Listeners,Listeners中提供了众多方法,可监听springboot的启动流程;- 准备运行环境时,会根据
webApplicationType的类型来创建、配置,得到相应类型的Environment对象,这 个对象后面会设置到spring容器中,spring容器中使用的Environment就是在这里创建及配置的; - 创建ioc容器时,也是根据
webApplicationType的类型来创建对应的ApplicationContext; - 在准备ioc容器的方法中,会对
ApplicationContext做一个配置 ,Initializers也会在这里运行; - 启动ioc容器时,springboot 会注册一个shutdownhook,用以在项目关闭时处理关闭操作,另外,对于ioc的启动流程,springboot 在其扩展中会创建及启动web容器;
- springboot 提供了两种类型的运行器:
ApplicationRunner、CommandLineRunner,在启动后会调用两者的方法。
以上内容讲的比较简略,如果要详细了解,可自行阅读前面的文章。
本文原文链接:my.oschina.net/funcy/blog/… ,限于作者个人水平,文中难免有错误之处,欢迎指正!原创不易,商业转载请联系作者获得授权,非商业转载请注明出处。