本篇基于 Spring Boot 2.4.4 版本进行分析
Spring Boot 的入口类
@SpringBootApplication
public class SpringBootBestPracticeApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootBestPracticeApplication.class, args);
}
}
做过 Spring Boot 项目的都知道,上面是 Spring Boot 最简单通用的入口类。入口类的要求是最顶层包下面第一个含有 main 方法的类,使用注解 @SpringBootApplication 来启用 Spring Boot 特性,使用 SpringApplication.run 方法来启动 Spring Boot 项目。
来看一下这个类的run方法调用关系源码:
public static ConfigurableApplicationContext run( Class<?> primarySource,
String... args) {
return run(new Class<?>[] { primarySource }, args);
}
public static ConfigurableApplicationContext run(Class<?>[] primarySources,
String[] args) {
return new SpringApplication(primarySources).run(args);
}
第一个参数primarySource:加载的主要资源类
第二个参数 args:传递给应用的应用参数
先用主要资源类来实例化一个 SpringApplication 对象,再调用这个对象的 run 方法,所以我们分两步来分析这个启动源码。
SpringApplication 的实例化过程
接着上面的 SpringApplication 构造方法进入以下源码:
public SpringApplication(Class<?>... primarySources) {
this(null, primarySources);
}
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
// 1、资源初始化资源加载器为 null
this.resourceLoader = resourceLoader;
// 2、断言主要加载资源类不能为 null,否则报错
Assert.notNull(primarySources, "PrimarySources must not be null");
// 3、初始化主要加载资源类集合并去重
this.primarySources =