一、创建SpringApplication对象
1、以Debug模式启动应用
2、Step Into SpringApplication.run方法,对run方法进行包装
3、继续Step Into run方法,这时候会先创建SpringApplication对象,然后才允许run方法
4、继续Step Into
5、进入this.initialize(sources)方法,判断sources是否为空,如果不为空就保存主配置类。之后
通过this.deduceWebEnvironment()方法,判断是否为web应用,因为导入了web模块,所以为web应用。
6、this.setInitializers方法的核心就是调用getSpringFactoriesInstances方法,点击this.getSpringFactoriesInstances(ApplicationContextInitializer.class)方法,之后点击
this.getSpringFactoriesInstances(type, new Class[0]);方法,这时候会看到有一个loadFactoryNames方法,会去类路径下
META-INF/spring.factories配置的所有 ApplicationContextInitializer 类,然后保存
7、this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));点击setInitializers方法,我们可以看到有7个ApplicationContextInitializer类
8、ApplicationContextInitializer已经拿到所有并保存起来,ApplicationListener道理也一样,也是去META-INF/spring.factories配置的所有 ApplicationListener类,拿到10个ApplicationListener,然后保存
,9、从多个配置类中找到含有mainf方法的配置类,此时SpringApplication对象创建成功。
二、启动应用 run方法
1、当SpringApplication对象创建完成,继续Step Into
继续Step Into
2、进入run方法
3、run方法里面的
也是从类路径下的META-INF/spring.factories拿到Listener
4、回调所有的listeners.starting();方法
5、run方法里面prepareEnvironment方法,创建应用所需的环境,环境创建成功后,继续回调SpringApplicationRunListeners的environmentPrepared方法
6、看控制台,打印的是
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容器