1. SpringBoot启动流程概述
SpringBoot作为Java生态中最流行的应用框架之一,其启动过程看似简单,实则暗藏玄机。当你执行一个简单的main()方法启动SpringBoot应用时,背后其实经历了一系列精密的初始化流程。这个过程就像组装一台精密仪器——从拧紧第一颗螺丝到整机通电运行,每个环节都环环相扣。
典型的SpringBoot启动流程包含几个关键阶段:
- 环境准备阶段:解析命令行参数、准备环境变量
- 应用上下文创建:初始化Spring容器
- 自动配置加载:处理@EnableAutoConfiguration逻辑
- Bean实例化:执行依赖注入和生命周期回调
- 内嵌容器启动:如Tomcat/Jetty等Web容器的初始化
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 启动入口与初始化
2.1 main()方法的魔法
每个SpringBoot应用的入口都是一个标准的Java main方法:
java复制@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
这个看似简单的方法调用背后,SpringApplication类完成了以下关键操作:
- 推断应用类型(Web应用还是普通应用)
- 创建并配置Environment对象
- 准备Banner(就是启动时控制台显示的那个Spring图标)
- 创建ApplicationContext
- 执行ApplicationContextInitializer
- 执行ApplicationRunner和CommandLineRunner
2.2 SpringApplication初始化
SpringApplication的构造过程包含几个重要步骤:
java复制public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
this.resourceLoader = resourceLoader;
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
this.webApplicationType = WebApplicationType.deduceFromClasspath();
this.bootstrapRegistryInitializers = new ArrayList<>(
getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();
}
关键点解析:
- webApplicationType的推断基于类路径中是否存在特定类(如Servlet相关类)
- 通过SpringFactoriesLoader加载META-INF/spring.factories中定义的初始器和监听器
- mainApplicationClass的推断通过分析调用栈实现
3. 环境准备与上下文创建
3.1 环境准备流程
环境准备是启动过程中容易被忽视但极其重要的一环:
-
创建Environment对象(StandardServletEnvironment或StandardEnvironment)
-
配置PropertySources(按优先级排序):
- 系统属性(System.getProperties())
- 系统环境变量(System.getenv())
- 随机属性(random.*)
- 应用配置文件(application.properties/yml)
- @PropertySource注解指定的属性源
-
处理Profile激活:
- 解析spring.profiles.active配置
- 设置默认profile("default")
3.2 应用上下文创建
SpringBoot根据应用类型创建不同的ApplicationContext:
- Web应用:AnnotationConfigServletWebServerApplicationContext
- 响应式Web应用:AnnotationConfigReactiveWebServerApplicationContext
- 普通应用:AnnotationConfigApplicationContext
创建过程的关键步骤:
- 实例化BeanDefinitionReader
- 注册主配置类(@SpringBootApplication标注的类)
- 准备BeanFactory后置处理器
- 初始化消息源(MessageSource)
- 初始化应用事件广播器
4. 自动配置机制解析
4.1 @EnableAutoConfiguration原理
@SpringBootApplication是一个复合注解,包含三个核心注解:
java复制@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { /* ... */ })
public @interface SpringBootApplication {
// ...
}
其中@EnableAutoConfiguration是自动配置的核心,其工作原理:
- 通过@Import导入AutoConfigurationImportSelector
- AutoConfigurationImportSelector使用SpringFactoriesLoader加载META-INF/spring/org.springframework.boot.autoconf
