前言
作为Java生态中最流行的框架之一,SpringBoot极大地简化了Spring应用的开发过程。通过对其源码的深入理解,我们不仅能更好地使用这个框架,还能学习到优秀的设计理念和编程技巧。本文将作为SpringBoot源码阅读系列的第一篇,重点介绍SpringBoot的启动流程。
从最简单的示例开始
在开始源码分析之前,让我们先看一个最基础的SpringBoot应用:
java
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
这个简单的例子包含了SpringBoot启动的核心要素。接下来,我们将逐层剖析其中的奥秘。
@SpringBootApplication注解解析
@SpringBootApplication
是一个复合注解,它包含了以下三个关键注解:
@SpringBootConfiguration
:标识这是一个SpringBoot的配置类@ComponentScan
:启用组件扫描@EnableAutoConfiguration
:开启自动配置功能
其中最核心的是@EnableAutoConfiguration
,它是SpringBoot自动配置的关键。
SpringApplication.run()方法分析
SpringApplication.run()
方法是启动流程的入口,其主要步骤如下:
- 创建SpringApplication实例
- 推断应用类型(SERVLET/REACTIVE/NONE)
- 设置初始化器(Initializer)
- 设置监听器(Listener)
- 准备环境
- 创建环境对象(StandardServletEnvironment)
- 配置属性源(PropertySource)
- 绑定外部配置
- 创建应用上下文
- 根据应用类型创建对应的ApplicationContext
- 准备上下文
- 刷新上下文
- 注册Bean定义
- 初始化单例Bean
- 触发各种生命周期事件
自动配置原理
SpringBoot的自动配置是通过@EnableAutoConfiguration
注解实现的,其核心机制包括:
-
spring.factories
文件- 位于META-INF目录下
- 包含自动配置类的清单
-
条件注解
@ConditionalOnClass
@ConditionalOnMissingBean
@ConditionalOnProperty
等等
-
配置顺序
- 通过
@AutoConfigureBefore
@AutoConfigureAfter
@AutoConfigureOrder
控制
- 通过
核心源码分析
让我们看一下SpringApplication.run()
方法的关键源码:
java
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
configureHeadlessProperty();
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
configureIgnoreBeanInfo(environment);
Banner printedBanner = printBanner(environment);
context = createApplicationContext();
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class);
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
refreshContext(context);
afterRefresh(context, applicationArguments);
stopWatch.stop();
return context;
} catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, listeners);
throw new IllegalStateException(ex);
}
}
总结
通过对SpringBoot启动流程的分析,我们可以看到:
- SpringBoot通过精心设计的注解体系简化了配置
- 自动配置机制大大减少了开发者的工作量
- 整个启动流程层次分明,职责清晰
在后续的文章中,我们将深入探讨更多细节,包括:
- 自动配置的具体实现
- 条件注解的工作原理
- Bean的生命周期管理
- 事件监听机制等
参考资料
- Spring Boot官方文档
- Spring Boot源码(版本2.7.x)
- 《Spring Boot编程思想》 - 小马哥