理解 Spring Boot 的运行机制,是掌握现代 Java Web 开发的关键。我们可以从 宏观架构 + 启动流程 + 核心原理 三个层面来系统性地拆解。
🌟 一句话总结
Spring Boot = Spring 框架 + 自动配置(AutoConfiguration)+ 内嵌服务器(如 Tomcat) + 约定优于配置(Convention over Configuration)
它让你 不用写 XML、不用配 web.xml、不用手动部署 WAR 包,直接 main() 方法启动一个完整的 Web 应用。
一、宏观视角:Spring Boot 是如何工作的?
🧩 整体架构图(简化版)
graph LR
A[你的代码] --> B(Spring Boot Starter)
B --> C[Spring Framework]
C --> D[内嵌 Tomcat/Jetty]
D --> E[HTTP 请求/响应]
F[application.yml] --> C
G[@SpringBootApplication] --> C
- 你的代码:Controller、Service、Mapper 等
-
Starter:
spring-boot-starter-web、mybatis-spring-boot-starter等,自动引入依赖和配置 - Spring Framework:核心容器(IoC、AOP)、事务、Web MVC 等
- 内嵌服务器:无需外部 Tomcat,直接运行 JAR 包
-
配置文件:
application.yml控制行为
二、启动流程详解(从 main() 到接收请求)
🔁 步骤 1:执行 main() 方法
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); // ← 关键入口
}
}
这不是普通程序入口,而是 启动 Spring 容器的命令。
🔁 步骤 2:创建 SpringApplication 实例
SpringApplication.run() 内部会:
- 推断应用类型(SERVLET / REACTIVE)
- 设置初始化器(Initializers)
- 设置监听器(Listeners)
- 推断主配置类(即带
@SpringBootApplication的类)
🔁 步骤 3:刷新 Spring 应用上下文(refresh context)
这是最核心的一步,包含以下子过程:
✅ 3.1 扫描组件(***ponent Scan)
- 从
@SpringBootApplication所在包开始递归扫描 - 发现
@***ponent,@Service,@Controller,@Repository等注解的类 - 将它们注册为 BeanDefinition(Bean 的“蓝图”)
✅ 3.2 加载自动配置(AutoConfiguration)
- 读取
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports - 根据 classpath 中的依赖(如存在
tomcat-embed-core.jar),自动启用TomcatServletWebServerFactory - 条件装配:只有满足条件才生效(如
@ConditionalOnClass(DataSource.class))
💡 这就是为什么你只加
mybatis-spring-boot-starter,MyBatis 就能自动工作!
✅ 3.3 创建 Bean 实例(IoC 容器初始化)
- 遍历所有 BeanDefinition
- 通过反射调用构造函数 →
new XxxService() - 执行依赖注入(
@Autowired) - 调用初始化方法(
@PostConstruct)
✅ 3.4 启动内嵌 Web 服务器
- 如果是 Web 应用,会创建 Tomcat 实例
- 注册 DispatcherServlet(Spring MVC 的核心)
- 绑定端口(默认 8080)
✅ 3.5 触发启动完成事件
- 调用
***mandLineRunner/ApplicationRunner - 日志输出:
Started Application in X.XXX seconds
🔁 步骤 4:等待并处理 HTTP 请求
当用户访问 http://localhost:8080/api/user:
浏览器 →
↓
内嵌 Tomcat 接收请求 →
↓
DispatcherServlet(前端控制器) →
↓
HandlerMapping 找到匹配的 @Controller →
↓
调用对应方法(如 getUser()) →
↓
返回结果(JSON / 页面) →
↓
Tomcat 返回响应给浏览器
✅ 整个过程由 Spring MVC 驱动,而 Spring MVC 是 Spring Framework 的一部分。
三、核心机制解析
1️⃣ 控制反转(IoC)与依赖注入(DI)
-
IoC:对象的创建权交给 Spring 容器(不再是
new) -
DI:容器自动把依赖的对象“注入”进来(
@Autowired)
👉 结果:代码解耦,易于测试和维护。
2️⃣ 自动配置(AutoConfiguration)
Spring Boot 通过 @EnableAutoConfiguration 实现“智能配置”。
例如:
- 发现 classpath 有
HikariCP→ 自动配置数据源 - 发现有
spring-webmvc→ 自动配置 DispatcherServlet - 发现有
mybatis-spring→ 自动配置 SqlSessionFactory
✅ 你只需在
application.yml中写:spring: datasource: url: jdbc:mysql://...
3️⃣ Starter 机制
Starter 是“一站式依赖包”,比如:
| Starter | 功能 |
|---|---|
spring-boot-starter-web |
Web 开发(含 Tomcat + Spring MVC) |
mybatis-spring-boot-starter |
MyBatis 集成 |
spring-boot-starter-data-redis |
Redis 支持 |
💡 引入 starter 后,Spring Boot 自动完成配置,你几乎不用写代码。
4️⃣ 内嵌服务器
- 默认使用 Tomcat(可切换为 Jetty 或 Undertow)
- 打包成 JAR(不是 WAR),直接
java -jar app.jar运行 - 无需安装外部 Web 容器
四、若依(RuoYi)项目中的体现
你在若依项目中看到的:
@SpringBootApplication
@EnableAsync
@EnableTransactionManagement
public class RuoYiApplication {
public static void main(String[] args) {
SpringApplication.run(RuoYiApplication.class, args);
}
}
-
@SpringBootApplication:启动自动配置 + 组件扫描 -
@EnableAsync:开启异步支持(@Async) -
@EnableTransactionManagement:开启事务管理(@Transactional)
当你访问 /system/user/list:
- 请求被 Tomcat 接收
- DispatcherServlet 路由到
SysUserController.list() - 调用
SysUserService.selectUserList() -
SysUserMapper.selectUserList()执行 SQL - 返回 JSON 数据
✅ 全程由 Spring Boot 自动串联,你只需关注业务逻辑。
五、可视化:Spring Boot 启动流程图
六、常见误区澄清
| 误区 | 正确理解 |
|---|---|
| ❌ “Spring Boot 是一个新框架” | ✅ 它是 Spring Framework 的封装和增强 |
| ❌ “必须用注解,不能用 XML” | ✅ 仍可混合使用 XML 配置(但不推荐) |
| ❌ “自动配置无法定制” | ✅ 可通过 application.yml 覆盖,或 @EnableAutoConfiguration(exclude=...) 禁用 |
| ❌ “Bean 是多例的” | ✅ 默认是单例(Singleton),可通过 @Scope("prototype") 改变 |
七、总结:Spring Boot 的设计哲学
| 原则 | 说明 |
|---|---|
| ✅ 约定优于配置 | 默认行为合理,减少配置 |
| ✅ 开箱即用 | 引入 starter 即可工作 |
| ✅ 生产就绪 | 内置监控(Actuator)、健康检查 |
| ✅ 快速开发 | 热部署、简化部署(JAR 直接运行) |
💡 学习建议
- 先会用:写 Controller、Service、Mapper,跑通 CRUD
- 再理解:看启动日志,了解自动配置过程
-
最后深入:阅读
spring-boot-autoconfigure源码,理解条件装配