springboot的运行机制详细解读

 更新时间:2025年12月19日 14:42:49   作者:杰西笔记  
SpringBoot是Spring框架的封装与增强,通过自动配置和内嵌服务器简化了JavaWeb开发,从宏观架构、启动流程、核心原理三个层面深入解析,强调了控制反转、自动配置和Starter机制,通过若依项目实例展示了如何在实际应用中使用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 扫描组件(Component Scan)

  • @SpringBootApplication 所在包开始递归扫描
  • 发现 @Component, @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 触发启动完成事件

  • 调用 CommandLineRunner / 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-webWeb 开发(含 Tomcat + Spring MVC)
mybatis-spring-boot-starterMyBatis 集成
spring-boot-starter-data-redisRedis 支持

💡 引入 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 启动流程图

main() SpringApplication ApplicationContext Tomcat DispatcherServlet run() create & refresh() scan components load auto-configurations create beans (IoC) start embedded server register DispatcherServlet ready! Wait for HTTP requests... main() SpringApplication ApplicationContext Tomcat DispatcherServlet

六、常见误区澄清

误区正确理解
❌ “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 源码,理解条件装配

到此这篇关于springboot的运行机制解析的文章就介绍到这了,更多相关springboot运行机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot配置MyBatis-Plus实现增删查改

    SpringBoot配置MyBatis-Plus实现增删查改

    本文主要介绍了SpringBoot配置MyBatis-Plus实现增删查改,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java陷阱之assert关键字详解

    Java陷阱之assert关键字详解

    这篇文章详细介绍了Java陷阱之assert关键字,有需要的朋友可以参考一下
    2013-09-09
  • Java中重写和重载的区别及说明

    Java中重写和重载的区别及说明

    Java语言中的重载和重写是实现多态的两种方式,但他们的实现方式和规则有所不同,重载发生在一个类中,同名的方法如果有不同的参数列表,则视为重载,重写则发生在子类和父类之间,要求子类重写方法和父类被重写方法有相同的返回类型
    2024-10-10
  • Spring Security如何基于Authentication获取用户信息

    Spring Security如何基于Authentication获取用户信息

    这篇文章主要介绍了Spring Security如何基于Authentication获取用户信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java基础之引用相关知识总结

    Java基础之引用相关知识总结

    今天聊聊Java的引用,大多数时候我们说引用都是强引用,只有在对象不使用的情况下才会释放内存,其实Java 内存有四种不同的引用.一起看看吧,,需要的朋友可以参考下
    2021-05-05
  • 解决SpringBoot整合RocketMQ遇到的坑

    解决SpringBoot整合RocketMQ遇到的坑

    这篇文章主要介绍了解决SpringBoot整合RocketMQ遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java的Lambda表达式使用及说明

    Java的Lambda表达式使用及说明

    文章介绍了JavaSE8中的Lambda表达式,其基本语法、函数接口的概念以及在集合中的使用,同时,还讨论了Lambda表达式的变量捕获和一些优点与缺点
    2026-02-02
  • SpringBoot 实现CAS Server统一登录认证的详细步骤

    SpringBoot 实现CAS Server统一登录认证的详细步骤

    ​ CAS(Central Authentication Service)中心授权服务,是一个开源项目,目的在于为Web应用系统提供一种可靠的单点登录,这篇文章主要介绍了SpringBoot 实现CAS Server统一登录认证,需要的朋友可以参考下
    2024-02-02
  • java线程池ThreadPoolExecutor类使用小结

    java线程池ThreadPoolExecutor类使用小结

    这篇文章主要介绍了java线程池ThreadPoolExecutor类使用,本文主要对ThreadPoolExecutor的使用方法进行一个详细的概述,示例代码介绍了ThreadPoolExecutor的构造函数的相关知识,感兴趣的朋友一起看看吧
    2022-03-03
  • springboot项目使用Disruptor做内部消息队列的实现

    springboot项目使用Disruptor做内部消息队列的实现

    本文主要介绍了springboot项目使用Disruptor做内部消息队列的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论