执行run()方法
在SpringApplication对象创建完成之后,开始执行run()方法;重新启动Debug,进入run方法
此时SpringApplication对象已经创建好,run方法中的流程就是Spring Boot启动的流程。
Step Over第一句289行代码只是为了标记一个起始时间
这里是将创建SpringApplication对象时从配置文件中获取所有的BootstrapRegistryInitializer配置类,这里将列表遍历,但是列表为空,返回一个默认的DefaultBootstrapContext
第291行声明了一个容器,接下来所有的代码就是往这个容器中注册组件,最终返回这个容器
context容器中注入了哪些组件? 292行配置headless属性为True,与awt应用相关
SpringApplicationRunListeners listeners = getRunListeners(args); 复制代码
Step Into 进入到 getRunListeners方法
这里又调用了getSpringFactoriesInstances方法,这个方法的作用就是从类路径下的spring.factoies中获取指定的类,这里要获取的是所有的SpringApplicationRunListener类
这里获取了一个EventPublishRunListener
继续Step Over到294行
listeners.starting(bootstrapContext, this.mainApplicationClass); 复制代码
这里调用了starting方法,参数为默认的boostrapContext和SpringAppication中的主程序既AppApplication,进入starting方法
这里是循环启动这些监听器
在296行上打断点,重启启动debug模式;Step Over进入到prepareEnvironment方法中,也就是准备环境
该方法中先是创建了一个environment,创建环境之后回调listeners,表示环境准备完成
第299行是打印banner也就是启动应用时控制台出现的Spring图标,这个图标是可以自定义的
Step Into 进入 300行的createApplicationContext方法
再次step into进入到create方法
这里根据WebApplication是Servlet类型返回了AnnotationConfigServletWebServerApplicationContext容器
第301行给容器设置启动属性,设置了一个DefaultApplicationStartup
下一行第302行的作用是准备上下文环境,进入到该方法中;这个方法中对容器做了写配置
set环境,注册一些后置处理器,进入applyInitializers方法中
这个方法就是遍历SpringApplication中initializers中所有的initializer,然后调用initialize方法;遍历完成之后来到第382行
进入到contextPrepared方法中
这里就是回调所有的listener的contextPrepared方法
回到prepareContext方法,step over到第389行
这里就是注册命令行参数,并且将banner也注册进来;Step Over到第398行
这里做了判断,然后对容器进行了set操作;来到第406行
这里获取主程序类,然后判断是否为空