SpringBoot启动原理

2 阅读2分钟

Spring Boot 的启动原理可以用一句话概括:

一个 main 方法 → 启动 SpringApplication → 创建并刷新 Spring 容器 → 启动内嵌 Web 服务器 → 自动装配所有组件。

@EnableAutoConfiguration 会通过 AutoConfigurationImportSelectorMETA-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 MVC
  • WebFlux → 响应式
  • 都没有 → 普通 Java 程序

2. 创建并准备 Spring 容器

创建的是:

ConfigurableApplicationContext

例如:

  • Web 项目:AnnotationConfigServletWebServerApplicationContext

然后做:

  • 加载 ApplicationContextInitializer

  • 设置 Environment(读取配置)

    • application.yml
    • application.properties
    • 环境变量
    • JVM 参数
    • Nacos / Apollo 等

3. 刷新容器(核心)

等价于调用:

context.refresh();

这里进入 Spring 原生启动流程

  1. 扫描 Bean(@ComponentScan)
  2. 解析配置类(@Configuration)
  3. 处理自动装配(@EnableAutoConfiguration)
  4. 实例化 Bean
  5. 依赖注入
  6. 初始化 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

image.png

(老版本是 spring.factories)

里面是成百上千个自动配置类:

DataSourceAutoConfiguration
RedisAutoConfiguration
KafkaAutoConfiguration
TomcatAutoConfiguration
...

每个都带条件注解:

@ConditionalOnClass
@ConditionalOnBean
@ConditionalOnMissingBean
@ConditionalOnProperty

意思是:

类存在我才装
Bean 不存在我才装
配置开启我才装

这就实现了 智能装配


四、完整启动时序图(工程级视角)

main()
  ↓
SpringApplication.run()
  ↓
创建 ApplicationContext
  ↓
加载 Environment(配置中心 / yml / 变量)
  ↓
执行自动装配(EnableAutoConfiguration)
  ↓
扫描并实例化 Bean
  ↓
创建内嵌 Tomcat
  ↓
注册 DispatcherServlet
  ↓
启动端口监听
  ↓
应用就绪(ApplicationReadyEvent)