Spring Boot 启动流程

一、创建SpringApplication对象

 在META-INF配置相关监听器

Spring Boot 启动流程_第1张图片

1、以Debug模式启动应用

Spring Boot 启动流程_第2张图片

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

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

4、继续Step Into

Spring Boot 启动流程_第3张图片

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

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

Spring Boot 启动流程_第4张图片

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

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

Spring Boot 启动流程_第5张图片

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

Spring Boot 启动流程_第6张图片

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

Spring Boot 启动流程_第7张图片

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

Spring Boot 启动流程_第8张图片

Spring Boot 启动流程_第9张图片

二、启动应用 run方法

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

继续Step Into

2、进入run方法

Spring Boot 启动流程_第10张图片

3、run方法里面的 

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

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

Spring Boot 启动流程_第11张图片

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

Spring Boot 启动流程_第12张图片

6、看控制台,打印的是

Spring Boot 启动流程_第13张图片

7、 创建IOC容器,如果是web就创建web IOC容器,否侧就创建普通IOC容器。

8、异常分析

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

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

11、先回调ApplicationRunner,回调CommandLineRunner

12、回调所有SpringApplicationRunListener 的finished

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

你可能感兴趣的:(Spring,Boot)