一、Debug Spring Boot 启动流程
创建工程spring-boot-fundamental,只添加基本依赖
Debug启动流程,在SpringApplication.run(AppApplication.class, args)这一行打上断点
创建SpringApplication对象
首先会创建SpringApplication对象
调用包含有ResourceLoader和Class<?>... 两个参数的构造函数创建对象
Assert.notNull(primarySources, "PrimarySources must not be null"); this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); 复制代码
primarySources包含了主配置类,这句代码是判断传入的primarySources是否为空,如果主配置类存在就一定不为空,并将这些Class存储到LinkedHashSet集合中
this.webApplicationType = WebApplicationType.deduceFromClasspath(); 复制代码
判断当前应用是不是Web应用
debug到这个方法中去
判断当前应用是一个Web应用
this.bootstrapRegistryInitializers = new ArrayList<>( getSpringFactoriesInstances(BootstrapRegistryInitializer.class)); 复制代码
就是从spring.factories配置文件中获取所有的自动配置类
getSpringFactoriesInstances方法就是从配置文件中获取指定的配置类,根据传入的类型
this.bootstrapRegistryInitializers = new ArrayList<>( getSpringFactoriesInstances(BootstrapRegistryInitializer.class)); 复制代码
这句代码就是获取所有的BootstrapRegistryInitializer配置类,将其实例化并放入一个ArrayList中,赋值给bootstrapRegistryInitializers属性
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); 复制代码
这句代码就是设置initializers属性,通过getSpringFactoriesInstance获取配置文件中所有的ApplicationContextInitializer并实例化放入集合中作为initializers属性的值
Debug可以看到放置了这8个initializer到集合中
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); 复制代码
setListeners也是通过调用getSpringFactoriesInstance获取配置文件中所有的ApplicationListener类并实例化放入listeners属性的集合中 debug查看放入多少个listener
deduceMainApplicationClass()方法是决定哪个程序是主程序
再往下进行debug
确定了主程序
到此,整个SpringApplication对象创建完成了
创建SpringApplication大概有这几步:
- 保存主配置类
- 判断是否为Web应用
- 从类路径下找到META-INF/spring.factorues配置所有的ApplicationContextInitializer,然后保存起来