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运行机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单了解Spring Web相关模块运行原理

    简单了解Spring Web相关模块运行原理

    这篇文章主要介绍了简单了解Spring Web相关模块运行原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java中PrintWriter使用方法介绍

    Java中PrintWriter使用方法介绍

    这篇文章主要介绍了Java中PrintWriter使用方法介绍,文章围绕主题展开PrintWriter使用方法的详细介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • JDK源码白话解读之ThreadLocal篇

    JDK源码白话解读之ThreadLocal篇

    其实网上有很多关于ThreadLocal的文章了,有不少文章也已经写的非常好了。但是很多同学反应还有一些部分没有讲解的十分清楚,还是有一定的疑惑没有想的十分清楚
    2022-02-02
  • 利用maven引入第三方jar包以及打包

    利用maven引入第三方jar包以及打包

    Maven是通过仓库对依赖进行管理的,当Maven项目需要某个依赖时,只要其POM中声明了依赖的坐标信息,Maven就会自动从仓库中去下载该构件使用,如何将jar引用到项目,并且能够让项目正常调用该jar包的方法,本篇文章重点针对于这两点进行讲解
    2023-05-05
  • SpringBoot整合Log4j2及配置步骤

    SpringBoot整合Log4j2及配置步骤

    这篇文章主要介绍了SpringBoot整合Log4j2以及配置详解,删除spring-boot-starter-parent默认使用spring-boot-starter-logging依赖,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • Java动态添加Scheduled的实现方式

    Java动态添加Scheduled的实现方式

    在Java中,动态添加​​Scheduled​​​定时任务可以通过多种方式实现,其中最常见的是使用Spring框架提供的​​@Scheduled​​​注解结合​​SchedulingConfigurer​​​接口,下面将详细介绍如何在Spring环境中动态地添加、修改和取消定时任务,需要的朋友可以参考下
    2025-10-10
  • 完美解决单例设计模式中懒汉式线程安全的问题

    完美解决单例设计模式中懒汉式线程安全的问题

    下面小编就为大家带来一篇完美解决单例设计模式中懒汉式线程安全的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 浅析springboot通过面向接口编程对控制反转IOC的理解

    浅析springboot通过面向接口编程对控制反转IOC的理解

    这篇文章主要介绍了springboot通过面向接口编程对控制反转IOC的理解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-08-08
  • Java实现冒泡排序

    Java实现冒泡排序

    这篇文章主要为大家详细介绍了Java实现冒泡排序,把一列数组按从小到大或从大到小排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 关于分布式锁(Redisson)的原理分析

    关于分布式锁(Redisson)的原理分析

    这篇文章主要介绍了关于分布式锁(Redisson)的原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论