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

发布于:2025-08-04 ⋅ 阅读:(17) ⋅ 点赞:(0)

我曾经写过一道面试题,题目是为什么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")
        @ResponseBody
        public 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 生态“既稳又快”发展的最佳注脚。


网站公告

今日签到

点亮在社区的每一天
去签到