一、创建SpringApplication对象

Spring Boot 启动流程 在META-INF配置相关监听器

Spring Boot 启动流程

1、以Debug模式启动应用

Spring Boot 启动流程

2、Step Into SpringApplication.run方法,对run方法进行包装

Spring Boot 启动流程

3、继续Step Into run方法,这时候会先创建SpringApplication对象,然后才允许run方法

Spring Boot 启动流程

4、继续Step Into

Spring Boot 启动流程

5、进入this.initialize(sources)方法,判断sources是否为空,如果不为空就保存主配置类。之后

通过this.deduceWebEnvironment()方法,判断是否为web应用,因为导入了web模块,所以为web应用。

Spring Boot 启动流程

6、this.setInitializers方法的核心就是调用getSpringFactoriesInstances方法,点击this.getSpringFactoriesInstances(ApplicationContextInitializer.class)方法,之后点击

this.getSpringFactoriesInstances(type, new Class[0]);方法,这时候会看到有一个loadFactoryNames方法,会去类路径下
META-INF/spring.factories配置的所有 ApplicationContextInitializer 类,然后保存

Spring Boot 启动流程

Spring Boot 启动流程

Spring Boot 启动流程

7、this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));点击setInitializers方法,我们可以看到有7个ApplicationContextInitializer类

Spring Boot 启动流程

8、ApplicationContextInitializer已经拿到所有并保存起来,ApplicationListener道理也一样,也是去META-INF/spring.factories配置的所有 ApplicationListener类,拿到10个ApplicationListener,然后保存

Spring Boot 启动流程

,9、从多个配置类中找到含有mainf方法的配置类,此时SpringApplication对象创建成功。

Spring Boot 启动流程

Spring Boot 启动流程

二、启动应用 run方法

1、当SpringApplication对象创建完成,继续Step Into

Spring Boot 启动流程

继续Step Into

Spring Boot 启动流程

2、进入run方法

Spring Boot 启动流程

3、run方法里面的 Spring Boot 启动流程

也是从类路径下的META-INF/spring.factories拿到Listener

Spring Boot 启动流程

4、回调所有的listeners.starting();方法

Spring Boot 启动流程

5、run方法里面prepareEnvironment方法,创建应用所需的环境,环境创建成功后,继续回调SpringApplicationRunListeners的environmentPrepared方法

Spring Boot 启动流程

6、Spring Boot 启动流程看控制台,打印的是

Spring Boot 启动流程

7、Spring Boot 启动流程 创建IOC容器,如果是web就创建web IOC容器,否侧就创建普通IOC容器。

8、Spring Boot 启动流程异常分析

9、准备上下文环境;将environment保存到ioc中;而且applyInitializers():回调之前保存的所有的ApplicationContextInitializer的initialize方法;回调所有的SpringApplicationRunListener的contextPrepared();Spring Boot 启动流程

10、初始化(刷新)IOC容器,如果是web IOC容器,会创建嵌入式Tomcat,作用:扫描、创建、加载所有组件(配置类、组件、自动配置)

Spring Boot 启动流程

11、先回调ApplicationRunner,回调CommandLineRunner

Spring Boot 启动流程

12、回调所有SpringApplicationRunListener 的finished

Spring Boot 启动流程

13、Spring Boot应用启动完毕,并返回IOC容器

Spring Boot 启动流程

相关文章: