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

每日面试题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.lryc.cn/news/609199.html

相关文章:

  • Linux 文件与目录操作命令宝典
  • Unity_数据持久化_IXmlSerializable接口
  • 【视频内容创作】PR的关键帧动画
  • SQL157 更新记录(一)
  • linux下jvm之jstack的使用
  • 代码随想录day53图论4
  • Java 大视界 -- Java 大数据在智能教育学习资源个性化推荐与学习路径动态调整中的深度应用(378)
  • 【LLM】 BaseModel的作用
  • 【0基础PS】PS工具详解--文字工具
  • Shell脚本-变量是什么
  • 思途JSP学习 0802(项目完整流程)
  • Linux网络编程 --- 多路转接select
  • Unity JobSystem 与 BurstCompiler 资料
  • 2025.8.3
  • webrtv弱网-QualityScalerResource 源码分析及算法原理
  • 【大模型实战】向量数据库实战 - Chroma Milvus
  • Linux mount挂载选项详解(重点关注nosuid)
  • ESP32开发问题汇总
  • ZStack Cloud 5.3.40正式发布
  • 第15届蓝桥杯Scratch图形化国赛初/中级组2024年9月7日真题
  • Product Hunt 每日热榜 | 2025-08-02
  • 01数据结构-时间复杂度和空间复杂度
  • Petalinux 23.2 构建过程中常见下载错误及解决方法总结
  • ORA-12514:TNS: 监听程序当前无法识别连接描述符中请求的服务
  • 小白学OpenCV系列2-理解图像
  • 使用纯Docker命令搭建多服务环境(Linux版)
  • Web 开发 11
  • 腾讯人脸识别
  • lumerical——锥形波导偏振转换
  • 大白话讲解MCP