news 2026/6/24 22:19:15

SpringBoot启动原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot启动原理

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


(老版本是 spring.factories)
里面是成百上千个自动配置类:
DataSourceAutoConfiguration RedisAutoConfiguration KafkaAutoConfiguration TomcatAutoConfiguration ...
每个都带条件注解:
@ConditionalOnClass @ConditionalOnBean @ConditionalOnMissingBean @ConditionalOnProperty
意思是:
类存在我才装
Bean 不存在我才装
配置开启我才装

这就实现了智能装配


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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 2:45:54

万和制药和安胶囊,营养补充与常见感冒药联用更安心

感冒期间,人体代谢加快,营养消耗增加,很多人会在服用感冒药的同时,选择营养补充剂提升抵抗力,但用药安全是核心考量。深圳万和制药的和安复方氨基酸胶囊(8-11),与常见感冒药联用的安…

作者头像 李华
网站建设 2026/6/22 23:24:38

【Java并发】ForkJoinPool和ThreadPoolExecutor的区别

【Java并发】ForkJoinPool和ThreadPoolExecutor的区别1、ForkJoinPool和ThreadPoolExecutor的区别2、为什么CompletableFuture使用ForkJoinPool?1、ForkJoinPool和ThreadPoolExecutor的区别 ForkJoinPool和ExecutorService都是Java中常用的线程池的实现&#xff0c…

作者头像 李华
网站建设 2026/6/23 4:18:20

第 4 篇:策略模式 (Strategy) —— 算法的热插拔艺术

专栏导读:你是否遇到过这种崩溃瞬间:产品卖给 A 客户要用 Modbus 协议,卖给 B 客户要用私有协议,卖给 C 客户要加密传输。你的代码里是不是充斥着无数的 #ifdef CUSTOMER_A 或者 if (mode 1)? 策略模式教你用 C 语言实…

作者头像 李华
网站建设 2026/6/23 4:22:34

Sentinel 流控配置案例:两次请求的时间间隔必须在3秒以上

要实现“两次请求的时间间隔必须在3秒以上”这种需求,需要根据具体的业务场景选择合适的Sentinel配置方式。本文博主将介绍几种实现方案: 方案1:使用排队等待流控效果(最接近需求) # Sentinel规则配置(对…

作者头像 李华
网站建设 2026/6/24 23:58:29

告别低效内耗!这款CRM营销管理系统,让职场人少走80%的弯路

你是否每天被这些职场难题裹挟,身心俱疲却业绩平平? ✅ 营销获客像“大海捞针”:砸钱投渠道、熬夜做推广,线索来了却杂乱无章,高价值客户藏在信息堆里无人问津,获客成本居高不下,转化效果惨不忍…

作者头像 李华