当前位置: 首页 > news >正文

一文搞懂:Spring与Spring Boot的区别——为什么现在都用Spring Boot?

📌 写在前面

很多Java程序员都有这样的经历:一开始学习Spring时,为了搭建一个简单的Web应用,要配置web.xml、指定DispatcherServlet、写一大堆XML配置文件……好不容易跑起来了,换台机器又得重来一遍。后来接触到Spring Boot,发现只需要一个main方法,几行注解,项目就能跑起来。甚至打成一个jar包,java -jar就能部署运行,再也不用手动配置Tomcat了。 但这种“开箱即用”的体验也带来了困惑:Spring Boot到底比Spring方便在哪?它启动时到底做了什么?为什么现在企业开发几乎都用Spring Boot?

这篇笔记,我从“启动前→启动中→启动后”三个时间线切入,剖析Spring Boot在三个阶段分别干了哪些关键事情,让你彻底搞懂两大框架的根本差异。

1️⃣ Spring Framework:灵活但“配置地狱”

Spring Framework是Java企业级开发的基石,提供了IoC容器、AOP、数据访问、Web MVC等丰富功能。但它有一个让开发者头疼的问题:配置繁琐

要让一个Spring Web项目跑起来,至少需要经历这些步骤:

  1. 管理依赖冲突:在pom.xml中手动引入Spring MVC、Servlet API、Jackson等库,还得逐个确认版本兼容性,稍有不慎就陷入“jar包冲突”。

  2. 配置web.xml:手动注册Spring MVC的核心控制器DispatcherServlet,指定配置文件位置和URL映射,任何一个标签写错都可能导致启动失败。

  3. 编写XML配置文件:配置视图解析器、数据源、事务管理器、AOP切面等,动辄几十上百行XML。

  4. 部署到外部容器:打完WAR包,还得手动部署到Tomcat、Jetty等外部Web容器。

这就是网上流传的“配置地狱”(Configuration Hell)。当时有一个段子:Spring项目搭完,一年过去了。

🔍 看看一个基于传统Spring MVC的项目究竟需要多少行代码才能启动?下面这张图展示了一个最简示例的目录结构和代码量,直观地反映了“配置地狱”的由来。

传统Spring MVC项目的最小化结构,每个配置文件都不可或缺,缺一个都无法启动。

2️⃣ Spring Boot:站在巨人肩膀上的革新者

Spring Boot并非重新发明轮子,它是在Spring Framework之上的增强框架。核心目标直指:让开发者瞬间从“配置地狱”中解放出来

那Spring Boot到底革新在何处?我们通过三个时间线来拆解:

  1. 启动前 (Pre-Boot):在代码未运行之前做了什么准备?——起步依赖(Starer)

  2. 启动中 (Boot-Time):在main()方法调用后,Spring Boot自动执行了哪些关键步骤?——自动配置与内嵌服务器

  3. 启动后 (Post-Boot):应用正常运行后,Spring Boot提供了什么额外功能支持实际项目?——Actuator监控

3️⃣ 启动前的博弈:依赖管理与起步依赖

3.1 传统Spring:依赖版本冲突令人头大

在传统Spring项目中,你需要在pom.xml中一个一个引入需要的依赖,并手动指定版本号。如果一个依赖(如Spring MVC)需要5.3.5版本的spring-web,另一个依赖却需要5.2.x版本,就会出现冲突。

3.2 Spring Boot起步依赖:一行代码打包全家桶

Spring Boot通过起步依赖将相关依赖打包成一个整体,一次引入批量生效。

示例:要搭建Web应用,传统Spring需要引入以下依赖:

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.5</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.5</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.4</version> </dependency> <!-- 可能还有更多 -->

而在Spring Boot项目中,你只需要写一行

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

这一行代码的背后,Maven通过依赖传递自动帮你引入了:

  • Spring MVC核心组件

  • 嵌入式Tomcat 10.x

  • Jackson JSON处理库

  • 版本经过官方兼容性测试的所有传递依赖

起步依赖的本质:本身不含功能代码,是一个“依赖聚合包”。它通过Maven/Gradle的依赖传递特性,将相关jar包进行预封装,从根本上保证了依赖版本的一致性。

🔥一句话总结启动前贡献Spring Boot通过Starter机制,将传统的"推一堆依赖"进化为"选套餐",极大减轻了大脑负担。

4️⃣ 启动中的秘密:自动配置与嵌入式服务器

这是让Spring Boot变得优雅的核心环节。当你在main方法中调用SpringApplication.run()时,一系列“魔法”悄然发生。

4.1 @SpringBootApplication 注解的“三部曲”

@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }

这个一行注解实际上是三个注解的组合:

  • @SpringBootConfiguration:标明该类为配置类。

  • @ComponentScan:启用组件扫描,自动发现和注册Bean。

  • @EnableAutoConfiguration:开启自动配置,这是整个自动配置机制的触发点

💡@EnableAutoConfiguration 内部做了什么?
它通过@Import(AutoConfigurationImportSelector.class),利用Spring的SPI机制扫描所有jar包中META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件的数百个配置类,并进行条件过滤。

4.2 条件配置:自动配置的“智能大脑”

Spring Boot的自动配置不是盲目地全量加载,而是通过@Conditional系列注解进行智能判断:

  • @ConditionalOnClass:当类路径存在指定类时生效。比如检测到DataSource.class,就自动装配数据源配置。

  • @ConditionalOnMissingBean:当容器中不存在指定Bean时生效,允许开发者通过自定义Bean覆盖默认配置。

  • @ConditionalOnProperty:根据配置文件中的属性值决定是否生效,是实现功能开关和多环境配置切换的核心工具。

  • @ConditionalOnWebApplication:当应用是Web类型时才启用相关配置。

当检测到spring-boot-starter-web在类路径中时,Spring Boot会:

  • ❓确认DispatcherServlet和其他Web组件是否存在于类路径

  • ✅如果存在,就自动在IoC容器中注册DispatcherServlet

  • ✅同时配置RequestMappingHandlerMapping等核心组件

💡 这种机制最大的好处是:开发者可以毫无感知地拿到一个“开箱即用”的Web环境

4.3 嵌入式服务器:一键启动的“秘密武器”

这是Spring Boot最令传统项目羡慕的地方。我们不再将应用打包成.war文件部署到外部Tomcat,因为Spring Boot直接把一个迷你、内嵌的Web服务器带进了Jar包本身

这是如何做到的?

  1. 启动时,根据spring-boot-starter-web的依赖,通过EmbeddedServletContainerFactory工厂类选择内嵌Web服务器(默认Tomcat)。

  2. 工厂类利用Tomcat的API创建Tomcat实例,设置端口和上下文路径。

  3. TomcatWebServer启动内部核心组件(Connector、Container、Engine等),完成Tomcat初始化。

  4. 然后DispatcherServlet和所有ServletContextInitializer实现类被加载,URL映射关系被注册。

  5. 最终,你的Web应用作为自身的宿主——可以直接用java -jar xxx.jar独立运行。

这一切在SpringApplication.run()过程中自动完成,开发者无需任何手动干预,代码量接近0。

🔥一句话总结启动中贡献启动中,Spring Boot通过AutoConfiguration智能装配+Embedded Container自主启动,彻底颠覆了启动体验。

5️⃣ 启动后的赋能:Actuator与运维监控

应用启动成功了,Spring Boot还不想“撒手不管”。它提供了一个强大的生产级功能:Spring Boot Actuator

Actuator通过一系列的REST端点,让开发和运维人员能轻松监控应用到极细颗粒度:

传统Spring项目实现这些功能需要手动编码;Spring Boot通过Actuator实现了开箱即用、立即可观测的运维支持。

🔥一句话总结:Spring Boot不仅擅长“启动应用”,还深刻理解“运维应用”。

6️⃣ 核心差异汇总表

一句话Spring是“灵活的积木”,让你自由搭建一切;Spring Boot是“精装方案”,让你拿来即用、快速落地。

假如你的项目中同时引入了Redis和Caffeine两个缓存的起步依赖,Spring Boot的CacheAutoConfiguration会同时创建RedisCacheManagerCaffeineCacheManager的两个配置类吗?如果不是,它会依据什么条件来决定加载哪一个?欢迎在评论区分享你的思考

http://www.jsqmd.com/news/732996/

相关文章:

  • OPC到底该怎么启动?3种模式,看完你就懂了
  • Unity游戏上架Google Play必看:AAB+PAD资源加载性能实测与内存优化方案
  • 2026年艺术漆公司实力排行,艺术漆代理/艺术漆加盟/艺术漆代理加盟艺术涂料/艺术漆招商 - 品牌策略师
  • Node.js fs模块实战:从回调地狱到Promise/Stream,手把手教你处理大文件读写
  • 2026年5月阿里云Hermes Agent/OpenClaw搭建解析+百炼token Plan全流程攻略
  • Moonlight-PC深度解析:跨平台游戏串流技术的Java实现方案
  • ATC美国技术陶瓷原厂厂装一级代理分销经销
  • 在 Claude Code 中无缝接入 Taotoken 提供的模型服务
  • 5分钟搞定微信聊天记录解密:WechatDecrypt终极指南
  • Onekey终极教程:3分钟学会免费获取Steam游戏清单的完整方案
  • 《数字内容资产成熟度认证白皮书》深度解读(二):三维模型如何“打分”?——12项指标重塑内容价值评价标尺
  • 如何快速上手PvZ Toolkit:植物大战僵尸终极开源修改器完整指南
  • MiMo V2.5 邀请码 V4B9NJ
  • 手把手教你用Python+OpenCV模拟‘找色’自瞄原理(仅供学习反作弊)
  • 对比直接使用官方 API 通过 Taotoken 聚合接入的成本与便利性
  • 全球即时通讯工具
  • 当家方知柴米贵:资源感知优化如何让 AI 智能体告别“算力浪费”?
  • 从‘龙龙送外卖’到‘最小连通子图’:PTA L2-043题解与一种通用贪心思路
  • 别再让YOLOv7在人群里‘抓瞎’:用CrowdHuman数据集搞定头部、全身、可见身体检测(附完整训练权重)
  • 避开预警坑!2024年计算机/AI领域这些SCI期刊还能投(含CCF推荐、ELSEVIER/WILEY出版社清单)
  • 保姆级教程:用ENVI5.6和Sarscape处理高分三号雷达影像,从数据导入到地理编码全流程
  • 通过curl命令快速测试Taotoken的OpenAI兼容接口是否通畅
  • 2026年5月阿里云怎么搭建OpenClaw/Hermes Agent?百炼token Plan配置详解攻略
  • 微信读书笔记管理的终极解决方案:WeReader扩展完整指南
  • 自家山地被征收,补偿面积怎么算才不吃亏?一个公式帮你搞懂
  • 面试官最爱问的C++内存管理:从new/delete到智能指针,一个完整的内存泄漏排查实战
  • Spring AI 实战:从0到1搭建第一个AI应用
  • AI 算法与模型测试工程师全解析
  • 免费好用的图片压缩工具
  • 别再死记硬背了!用C语言代码和调试器,5分钟搞懂补码为什么是计算机运算的核心