Spring Boot技术内幕:架构设计与实现原理
上QQ阅读APP看书,第一时间看更新

3.2 SpringApplication实例化流程

上面我们了解了进行SpringApplication实例化的基本方法,下面我们先通过一张简单的流程图来系统地学习在创建SpringApplication对象时都进行了哪些核心操作,如图3-1所示。

图3-1 创建SpringApplication核心操作流程图

通过图3-1可以看出,在SpringApplication对象实例化的过程中主要做了3件事:参数赋值给成员变量、应用类型及方法推断和ApplicationContext相关内容加载及实例化。

我们结合流程图看一下SpringApplication两个构造方法的核心源代码。


public SpringApplication(Class<?>... primarySources) {
    this(null, primarySources);
}

@SuppressWarnings({ "unchecked", "rawtypes" })
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    this.resourceLoader = resourceLoader;
    Assert.notNull(primarySources, "PrimarySources must not be null");
    this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
    // 推断Web应用类型
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    // 加载并初始化ApplicationContextInitializer及相关实现类
    setInitializers((Collection)
    getSpringFactoriesInstances(ApplicationContextInitializer.class));
    // 加载并初始化ApplicationListener及相关实现类
    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    // 推断main方法Class类
    this.mainApplicationClass = deduceMainApplicationClass();
}

SpringApplication提供了两个构造方法,核心业务逻辑在第二个构造方法中实现,在后面章节我们会从构造方法中的具体实现入手进行详细讲解,先来了解SpringApplication的初始化过程。