每日面试题20:spring和spring boot的区别

我曾经写过一道面试题,题目是为什么springboot项目可以直接打包给别人运行?其实这涉及到的就是springboot的特点。今天来简单了解一下springboot和spring的区别,

Spring 与 Spring Boot:从“全能框架”到“开箱即用”的进化之路


一、核心定位:Spring 是“地基”,Spring Boot 是“精装房”

要理解两者的差异,首先需要明确它们的核心定位:

1. Spring:企业级开发的“全能基础设施”

Spring 框架诞生于 2002 年,由 Rod Johnson 在其著作《Expert One-on-One J2EE Development without EJB》中提出。它的核心目标是通过​​轻量级设计​​,解决传统 J2EE 开发中“重量级容器”(如 EJB)的臃肿问题,为企业级应用提供一套​​标准化、可扩展的开发框架​​。

Spring 的核心能力围绕两大设计模式展开:

  • ​IoC(控制反转)​​:将对象的创建、依赖管理和生命周期交给容器(Spring Container),而非由代码直接控制。例如,一个 UserService 需要调用 UserRepository,传统方式需手动 new UserRepository(),而 Spring 中只需通过 @Autowired 声明依赖,容器会自动注入实例。
  • ​AOP(面向切面编程)​​:将日志记录、权限校验、事务管理等“横切关注点”从核心业务逻辑中剥离,通过“切面”统一实现。例如,为所有接口添加日志记录,无需在每个方法中重复编写 log.info() 代码。

Spring 的“全能”体现在其强大的兼容性:它支持 XML/注解配置、整合 MyBatis/Hibernate 等 ORM 框架、对接 Redis/RabbitMQ 等中间件,甚至能与企业级标准(如 JPA、JMS)无缝集成。但也正因如此,Spring 的学习和使用门槛较高——开发者需要同时掌握框架本身的核心机制,以及各类依赖的整合技巧。

2. Spring Boot:让 Spring“开箱即用”的“脚手架”

随着 Spring 生态的扩张,项目配置的复杂度急剧上升:一个典型的 Spring Web 应用可能需要配置数据源、事务管理器、Web 服务器、日志框架……每个环节都需要编写大量 XML 或 Java Config 代码。即使是简单的“Hello World”应用,也可能需要 10+ 个配置文件。

2014 年,Spring Boot 1.0 发布,喊出“​​约定大于配置​​(Convention Over Configuration)”的口号,目标是​​消除繁琐的配置​​,让开发者能“零配置”快速启动一个可运行的 Spring 应用。它的本质是“Spring 的增强版工具集”,通过以下方式重构了开发体验:

  • ​自动化配置​​:内置大量“默认配置”,只需引入依赖(如 spring-boot-starter-web),Spring Boot 会自动装配 Web 服务器(Tomcat)、Spring MVC 等组件,无需手动配置。
  • ​内嵌式容器​​:应用可直接打包为 JAR/WAR,通过 java -jar 命令运行,无需依赖外部 Tomcat/Jetty 等服务器。
  • ​Starter 依赖管理​​:将常用功能(如数据库、缓存、安全)封装为“起步依赖”(如 spring-boot-starter-data-jpa),一个依赖即可引入整套关联库及默认配置。

简言之,Spring Boot 不是替代 Spring,而是通过“​​配置简化​​”和“​​工程提效​​”,让开发者能更专注于业务逻辑本身,而非框架的底层实现。


二、核心差异对比:从“手动组装”到“自动交付”

为了更直观地展示两者的区别,我们从​​配置管理​​、​​工程结构​​、​​生态扩展​​三个维度进行对比:

​维度​​Spring(传统方式)​​Spring Boot​
​配置方式​依赖 XML 或 Java Config 手动配置(如 applicationContext.xml@Configuration 类)自动化配置为主,仅需通过 application.properties/application.yml 覆盖默认值
​依赖管理​需手动管理大量 jar 包(如 Spring Core、Spring MVC、Jackson 等),易出现版本冲突通过 Starter 依赖“一站式”引入(如 spring-boot-starter-web 自动包含 MVC、Tomcat、Jackson)
​启动方式​需部署到外部 Web 服务器(如 Tomcat),通过 catalina.sh run 启动打包为可执行 JAR,直接 java -jar demo.jar 运行
​工程结构​灵活但需遵循规范(如 src/main/javasrc/main/resources),无强制约束推荐“约定式结构”(如 controllerservicedao 分层目录),降低学习成本
​扩展能力​高度灵活,可通过自定义 Bean、AOP 切面、Bean 后处理器等深度定制框架行为兼容 Spring 所有扩展方式,同时提供 Actuator(监控)、Auto-configuration(自动配置)等增强工具

三、典型案例:用 Spring vs Spring Boot 实现“Hello World”

通过一个简单的 Web 应用示例,能更直观地感受两者的差异。

场景:实现一个返回“Hello World”的 REST 接口

​传统 Spring 实现(以 Spring 5 + XML 配置为例)​
  1. ​创建 Maven 项目​​,手动添加 5+ 个依赖(spring-contextspring-webmvcjavax.servlet-api 等)。
  2. ​配置 Web 服务器​​:在 web.xml 中声明 DispatcherServlet,关联 Spring MVC 的配置文件。
  3. ​配置 Spring MVC​​:在 spring-mvc.xml 中启用注解驱动(<mvc:annotation-driven/>)、组件扫描(<context:component-scan base-package="com.example"/>)。
  4. ​编写 Controller​​:
    @Controller
    public class HelloController {@RequestMapping("/hello")@ResponseBodypublic String hello() {return "Hello World";}
    }
  5. ​部署运行​​:将项目打包为 WAR,部署到外部 Tomcat 服务器,启动后访问 http://localhost:8080/hello

​痛点​​:仅“Hello World”就需要配置 Web 服务器、Spring 上下文、MVC 组件,且依赖版本冲突风险高。


​Spring Boot 实现​
  1. ​创建 Spring Boot 项目​​:通过 Spring Initializr 选择 Web 依赖(自动生成 pom.xml,包含 spring-boot-starter-web)。
  2. ​编写 Controller​​(无需额外配置):
    @RestController
    public class HelloController {@GetMapping("/hello")public String hello() {return "Hello World";}
    }
  3. ​运行应用​​:直接执行 main 方法(Spring Boot 内置 Tomcat,自动启动):
    @SpringBootApplication
    public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
    }
  4. ​访问测试​​:启动后直接访问 http://localhost:8080/hello,无需任何额外部署。

​优势​​:0 配置启动、依赖自动管理、内嵌服务器,开发效率提升 80% 以上。


四、如何选择?Spring 与 Spring Boot 的适用场景

尽管 Spring Boot 已成为主流,但 Spring 并未被淘汰。两者的选择需结合具体场景:

  • ​选 Spring 的情况​​:

    • 需要深度定制 Spring 框架底层逻辑(如自定义 IoC 容器、AOP 增强);
    • 项目依赖非常特殊(如使用已淘汰的旧版本库,无法通过 Starter 整合);
    • 学习阶段需要深入理解 IoC/AOP 等核心原理(Spring 是最佳学习素材)。
  • ​选 Spring Boot 的情况​​:

    • 快速开发业务系统(如管理后台、API 服务);
    • 团队需要降低新人上手成本(约定式结构 + 自动化配置);
    • 微服务架构(Spring Boot 是 Spring Cloud 的基础,天然支持服务发现、配置中心等)。

总结:Spring 是根,Spring Boot 是枝叶

Spring 定义了企业级 Java 开发的“游戏规则”(IoC/AOP),而 Spring Boot 则是将这套规则“产品化”的工具——它不是替代,而是进化。正如 Spring Boot 官方文档所说:“​​Spring Boot 让 Spring 应用的创建、配置和部署变得前所未有的简单​​”。

对于开发者而言,掌握 Spring 核心原理(IoC/AOP)是基础,而熟练使用 Spring Boot 提升开发效率则是现代 Java 工程师的必备技能。两者的结合,正是 Java 生态“既稳又快”发展的最佳注脚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92164.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse数据迁移

ClickHouse实例是阿里云上的云实例&#xff0c;想同步数据到本地&#xff0c;本地部署有ClickHouse实例&#xff0c;下面为单库单表 源实例&#xff1a;阿里云cc-gs5xxxxxxx.public.clickhouse.ads.aliyuncs.com:8123 目标实例&#xff1a;本地172.16.22.10:8123 1、目标实例建…

sqli-labs-master/Less-41~Less-50

Less-41这一关还是用堆叠注入&#xff0c;这关数字型不需要闭合了。用堆叠的话&#xff0c;我们就不爆信息了。我们直接用堆叠&#xff0c;往进去写一条数据?id-1 union select 1,2,3;insert into users (id,username,password) values(666,zk,180)--看一下插进去了没?id-1 u…

Tiger任务管理系统-10

十是个很好美好的数字&#xff0c;十全十美&#xff0c;确实没让人失望&#xff0c;收获还是很大的。 温习了前端知识&#xff0c;巩固了jQuery&#xff0c;thymeleaf等被忽视的框架&#xff0c;意外将之前的所学所用的知识都连起来了&#xff0c;感觉有点像打通了任督二脉一样…

ora-01658 无法为表空间 users中的段创建initial区

ora-01658 无法为表空间 users中的段创建initial区 参考1 参考2 参考3 参考4 给用户新增表空间 alter tablespace system add datafile D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM03.DBF size 5G autoextend on next 10M;设置表空间文件自动扩展 ALTER DATABASE DATAFILE /…

lodash的替代品es-toolkit详解

一、es-toolkit简介 es-toolkit 是一款先进的高性能 JavaScript 实用程序库,体积小巧,并支持强类型注释,典型特征包括: 提供各种日常实用函数并采用现代实现,例如: debounce、delay、chunk、sum 和 pick 等 设计充分考虑了性能,在现代 JavaScript 环境中实现了 2-3 倍…

【原创】基于gemini-2.5-flash-preview-05-20多模态模型实现短视频的自动化二创

画面和解说保持一致&#xff0c;这个模型就是NB[16:57:37] [*] 正在从视频中提取帧和时长 (频率: 1.0 帧/秒)... [16:57:55] [] 提取完成。视频时长: 83.40秒, 提取了 84 帧。 [16:57:55] [*] 使用AI供应商: gemini [16:57:55] [*] 正在进行视觉分析... [16:57:55] L-> 正…

数仓架构 数据表建模

数仓架构 主要用来描述 数据加工的实时链路 和 离线链路之间的关系,即 流批 关系; lamda 架构, 是两条路, 实时计算式的, 维护数据的实时性。然后每天经过批计算后, 覆盖实时的计算结果。 保证数据准确性。 kappa架构, 即流批一体了 数据建模 星型模型是数据仓库中最…

vscode调试python脚本时无法进入函数内部的解决方法

只需在launch.json配置文件中添加“justMyCode”:false.

Python day37

浙大疏锦行 python day37. 内容&#xff1a; 保存模型只需要保存模型的参数即可&#xff0c;使用的时候直接构建模型再导入参数即可 # 保存模型参数 torch.save(model.state_dict(), "model_weights.pth")# 加载参数&#xff08;需先定义模型结构&#xff09; mod…

ORACLE进阶操作

1 事务 事务的任务便是使数据库从一种状态变换成为另一种状态&#xff0c;这不同于文件系统&#xff0c;它是数据库所特用的。 所有的数据库中&#xff0c;事务只针对DML&#xff08;增删改)&#xff0c;不针对select select只能查看其他事务提交或回滚的数据&#xff0c;不能查…

Modbus 的一些理解

疑问&#xff1a;&#xff08;使用的是Modbustcp&#xff09;我在 Modbus slave 上面设置了slave地址为1&#xff0c;位置为40001的位置的值为1&#xff0c;40001这个位置上面的值是怎么存储的&#xff0c;存储在哪里的&#xff1f;他们是怎么进行交互的&#xff1f;在Modbus协…

【运动控制框架】WPF运动控制框架源码,可用于激光切割机,雕刻机,分板机,点胶机,插件机等设备,开箱即用

WPF运动控制框架源码&#xff0c;可用于激光切割机&#xff0c;雕刻机&#xff0c;分板机&#xff0c;点胶机&#xff0c;插件机等设备&#xff0c;考虑到各运动控制硬件不同&#xff0c;视觉应用功能&#xff08;应用视觉软件&#xff09;也不同&#xff0c;所以只开发各路径编…

RabbitMQ-日常运维命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。中间件&#xff0c;我给它的定义就是为了实现某系业务功能依赖的软件&#xff0c;包括如下部分:Web服务器代理…

【Linux基础知识系列】第九十篇 - 使用awk进行文本处理

在Linux系统中&#xff0c;文本处理是一个常见的任务&#xff0c;尤其是在处理日志文件、配置文件和数据文件时。awk是一个功能强大的文本处理工具&#xff0c;广泛用于数据提取、分析和格式化。它不仅可以处理简单的文本文件&#xff0c;还可以处理复杂的结构化数据&#xff0…

第二十七天(数据结构:图)

图&#xff1a;是一种非线性结构形式化的描述: G{V,R}V:图中各个顶点元素(如果这个图代表的是地图&#xff0c;这个顶点就是各个点的地址)R:关系集合&#xff0c;图中顶点与顶点之间的关系(如果是地图&#xff0c;这个关系集合可能就代表的是各个地点之间的距离)在顶点与顶点…

数据赋能(386)——数据挖掘——迭代过程

概述重要性如下&#xff1a;提升挖掘效果&#xff1a;迭代过程能不断优化数据挖掘模型&#xff0c;提高挖掘结果的准确性和有效性&#xff0c;从而更好地满足业务需求。适应复杂数据&#xff1a;数据往往具有复杂性和多样性&#xff0c;通过迭代可以逐步探索和适应数据的特点&a…

什么是键值缓存?让 LLM 闪电般快速

一、为什么 LLMs 需要 KV 缓存&#xff1f;大语言模型&#xff08;LLMs&#xff09;的文本生成遵循 “自回归” 模式 —— 每次仅输出一个 token&#xff08;如词语、字符或子词&#xff09;&#xff0c;再将该 token 与历史序列拼接&#xff0c;作为下一轮输入&#xff0c;直到…

16.Home-懒加载指令优化

问题1&#xff1a;逻辑书写位置不合理问题2&#xff1a;重复监听问题已经加载完毕但是还在监听

Day116 若依融合mqtt

MQTT 1.MQTT协议概述MQTT是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;设计用于低带宽、高延迟或不稳定的网络环境&#xff0c;广泛应用于物联网领域1.1 MQTT协议的应用场景1.智能家居、车联网、工业物联网&#xff1a;MQTT可以用于连接各种家电设备和传感器&#…

PyTorch + PaddlePaddle 语音识别

PyTorch PaddlePaddle 语音识别 目录 概述环境配置基础理论数据预处理模型架构设计完整实现案例模型训练与评估推理与部署性能优化技巧总结 语音识别&#xff08;ASR, Automatic Speech Recognition&#xff09;是将音频信号转换为文本的技术。结合PyTorch和PaddlePaddle的…