SpringBoot启动原理
main() ↓ SpringApplication.run() ↓ 创建 ApplicationContext ↓ 加载 Environment(配置中心 / yml / 变量) ↓ 执行自动装配(EnableAutoConfiguration) ↓ 扫描并实例化 Bean ↓ 创建内嵌 Tomcat ↓ 注册 DispatcherServlet ↓ 启动端口监听 ↓ 应用就绪(Applicat
Spring Boot 的启动原理可以用一句话概括:
一个 main 方法 → 启动 SpringApplication → 创建并刷新 Spring 容器 → 启动内嵌 Web 服务器 → 自动装配所有组件。@EnableAutoConfiguration 会通过 AutoConfigurationImportSelector 从 META-INF/spring/...AutoConfiguration.imports 收集所有自动配置类,并基于 @Conditional* 条件(类存在/属性开启/Bean 缺失等)筛选、排序后导入到容器,最终实现“starter 引入依赖即可自动获得默认 Bean 与功能”。
下面按真实底层流程给你拆开讲(偏源码级思路)。
一、入口:main 方法
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
真正做事的是:
SpringApplication.run()
二、SpringApplication.run 做了什么?
核心四步:
1. 推断应用类型(Web / Reactive / None)
ApplicationType = SERVLET / REACTIVE / NONE
判断有没有:
DispatcherServlet→ Spring MVCWebFlux→ 响应式- 都没有 → 普通 Java 程序
2. 创建并准备 Spring 容器
创建的是:
ConfigurableApplicationContext
例如:
- Web 项目:
AnnotationConfigServletWebServerApplicationContext
然后做:
- 加载
ApplicationContextInitializer - 设置 Environment(读取配置)
- application.yml
- application.properties
- 环境变量
- JVM 参数
- Nacos / Apollo 等
3. 刷新容器(核心)
等价于调用:
context.refresh();
这里进入 Spring 原生启动流程:
- 扫描 Bean(@ComponentScan)
- 解析配置类(@Configuration)
- 处理自动装配(@EnableAutoConfiguration)
- 实例化 Bean
- 依赖注入
- 初始化 Bean(@PostConstruct, InitializingBean)
4. 启动内嵌 Tomcat / Netty / Jetty
Spring Boot 的革命性点:
把 Web 容器变成普通 Bean
自动创建:
TomcatServletWebServerFactory
然后:
webServer.start();
端口监听完成,应用可访问。
三、自动装配原理(Spring Boot 的灵魂)
你没写任何配置,却自动有:
- DataSource
- Redis
- Kafka
- MVC
- Jackson
- MyBatis
- ClickHouse Driver
- Tomcat
原因是:
1. @SpringBootApplication 本质
等价于:
@Configuration @ComponentScan @EnableAutoConfiguration
2. @EnableAutoConfiguration 干了什么?
它会加载:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

(老版本是 spring.factories)
里面是成百上千个自动配置类:
DataSourceAutoConfiguration RedisAutoConfiguration KafkaAutoConfiguration TomcatAutoConfiguration ...
每个都带条件注解:
@ConditionalOnClass @ConditionalOnBean @ConditionalOnMissingBean @ConditionalOnProperty
意思是:
类存在我才装
Bean 不存在我才装
配置开启我才装
这就实现了 智能装配。
四、完整启动时序图(工程级视角)
main() ↓ SpringApplication.run() ↓ 创建 ApplicationContext ↓ 加载 Environment(配置中心 / yml / 变量) ↓ 执行自动装配(EnableAutoConfiguration) ↓ 扫描并实例化 Bean ↓ 创建内嵌 Tomcat ↓ 注册 DispatcherServlet ↓ 启动端口监听 ↓ 应用就绪(ApplicationReadyEvent)
更多推荐



所有评论(0)