【SpringBoot】如何理解整个springboot的运行机制?

【SpringBoot】如何理解整个springboot的运行机制?


理解 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 等
  • Starterspring-boot-starter-webmybatis-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

  1. 请求被 Tomcat 接收
  2. DispatcherServlet 路由到 SysUserController.list()
  3. 调用 SysUserService.selectUserList()
  4. SysUserMapper.selectUserList() 执行 SQL
  5. 返回 JSON 数据

✅ 全程由 Spring Boot 自动串联,你只需关注业务逻辑。


五、可视化:Spring Boot 启动流程图


六、常见误区澄清

误区 正确理解
❌ “Spring Boot 是一个新框架” ✅ 它是 Spring Framework 的封装和增强
❌ “必须用注解,不能用 XML” ✅ 仍可混合使用 XML 配置(但不推荐)
❌ “自动配置无法定制” ✅ 可通过 application.yml 覆盖,或 @EnableAutoConfiguration(exclude=...) 禁用
❌ “Bean 是多例的” ✅ 默认是单例(Singleton),可通过 @Scope("prototype") 改变

七、总结:Spring Boot 的设计哲学

原则 说明
约定优于配置 默认行为合理,减少配置
开箱即用 引入 starter 即可工作
生产就绪 内置监控(Actuator)、健康检查
快速开发 热部署、简化部署(JAR 直接运行)

💡 学习建议

  1. 先会用:写 Controller、Service、Mapper,跑通 CRUD
  2. 再理解:看启动日志,了解自动配置过程
  3. 最后深入:阅读 spring-boot-autoconfigure 源码,理解条件装配

转载请说明出处内容投诉
CSS教程网 » 【SpringBoot】如何理解整个springboot的运行机制?

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买