【源码分析】 DEBUG SpringBoot自动装配源码

SpringBoot自动自动装配

SpringBoot启动流程

注意:此博文只为记录自己DEBUG 源码核心过程,大家可能看不太明白,还请谅解!

####启动准备

  1. 启动类为入口

【源码分析】 DEBUG SpringBoot自动装配源码

  1. 进入run方法

【源码分析】 DEBUG SpringBoot自动装配源码

  1. 创建了一个SpringBoot程序

【源码分析】 DEBUG SpringBoot自动装配源码

  1. SpringApplication构造器

【源码分析】 DEBUG SpringBoot自动装配源码

  1. 进入getSpringFactoriesInstances方法

【源码分析】 DEBUG SpringBoot自动装配源码

  1. 进入loadFactoryNames方法

【源码分析】 DEBUG SpringBoot自动装配源码

  1. 进入loadSpringFactories

【源码分析】 DEBUG SpringBoot自动装配源码

这里加载的资源路径正是spring.factories的路径!

回到getSpringFactoriesInstances方法

【源码分析】 DEBUG SpringBoot自动装配源码

​ 通过反射实例化

【源码分析】 DEBUG SpringBoot自动装配源码

  1. 加载完spring.factories 中ApplicationContextInitializer下的类后,一共加载了七个类

【源码分析】 DEBUG SpringBoot自动装配源码

​ 这七个类分别是:

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

  1. 将获取的类集合设置到initializers属性

【源码分析】 DEBUG SpringBoot自动装配源码

  1. ApplicationListener和上面类似

    【源码分析】 DEBUG SpringBoot自动装配源码

运行的核心步骤

  1. 环境准备

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

  1. 进入prepareContext方法

【源码分析】 DEBUG SpringBoot自动装配源码

  1. 在prepareContext方法末尾加载主启动类

    【源码分析】 DEBUG SpringBoot自动装配源码

  2. 进入load()方法

    【源码分析】 DEBUG SpringBoot自动装配源码

    【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

在@SpringBootApplication =》 @SpringBootConfiguration =》 @Configuration中

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

  1. 进入AbstractApplicationContext.refresh()方法

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

看这个类,使用全局搜索发现没有这个类

【源码分析】 DEBUG SpringBoot自动装配源码

搜索AnnotationConfigUtils类,发现里面有个属性,他的值和刚才的类一样

【源码分析】 DEBUG SpringBoot自动装配源码

找到这个属性的使用方法,发现实际是操作了一个ConfigurationClassPostProcessor类

【源码分析】 DEBUG SpringBoot自动装配源码

这个类刚好是BeanFactoryPostProcessor的扩展类

【源码分析】 DEBUG SpringBoot自动装配源码

继续往下执行,并进入这个方法

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

此时程序就进入前面说的ConfigurationClassPostProcessor类了

【源码分析】 DEBUG SpringBoot自动装配源码

如果没有被@Configuration修饰则直接返回,显然这里主启动类是被修饰的,所以继续往下执行

【源码分析】 DEBUG SpringBoot自动装配源码

这里对主启动类进行排序
【源码分析】 DEBUG SpringBoot自动装配源码

解析被@Configuration修饰的类

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

直到进入到

【源码分析】 DEBUG SpringBoot自动装配源码

找到这个方法才是真正解析的逻辑

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

重点说一下@Import

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

主要有一下两个

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

继续执行,返回到parse方法

【源码分析】 DEBUG SpringBoot自动装配源码

找到最下面的的process方法
【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码

这里的EnableAutoConfiguration类和spring.factories中的对应

【源码分析】 DEBUG SpringBoot自动装配源码

【源码分析】 DEBUG SpringBoot自动装配源码