前言
在之前的系列文章中,我们梳理了 SpringApplication 的启动流程,了解了引导上下文、环境准备以及 Bean 工厂的核心组件功能。接下来,我们将深入探讨应用上下文的构造方法,这是 Spring Boot 启动过程中承上启下的关键环节。
本文基于 Spring Boot 2.7.18 版本,重点分析 createApplicationContext() 方法中创建的应用上下文对象及其初始化逻辑。
源码入口
整个启动流程的第 6 步是创建应用程序上下文,核心代码位于 SpringApplication 类的 run 方法中:
// SpringApplication 类方法
public ConfigurableApplicationContext run(String... args) {
// ... 前置步骤省略 ...
// 6. 创建应用程序上下文
context = createApplicationContext();
// ... 后续步骤省略 ...
}
这里调用的默认实现会实例化 AnnotationConfigServletWebServerApplicationContext。这个类不仅实现了 ApplicationContext 接口,还集成了 Servlet Web Server 的功能,是 Spring Boot Web 应用的标准上下文类型。
无参构造逻辑
当我们查看 AnnotationConfigServletWebServerApplicationContext 的无参构造函数时,会发现它主要做了两件事:初始化注解 Bean 定义读取器和初始化类路径 Bean 定义扫描器。
public class AnnotationConfigServletWebServerApplicationContext
extends ServletWebServerApplicationContext implements AnnotationConfigRegistry {
// 用于读取注解的 Bean 定义读取器
private final AnnotatedBeanDefinitionReader reader;
// 用于扫描类路径并注册 Bean 定义的扫描器
private final ClassPathBeanDefinitionScanner scanner;
public AnnotationConfigServletWebServerApplicationContext() {
// 初始化注解 Bean 定义读取器
this.reader = new AnnotatedBeanDefinitionReader(this);
.scanner = ();
}
}

