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)