Spring, Spring MVC, Spring Boot 分别是什么?

75 阅读2分钟

要理解三者关系,核心是“从基础框架到简化工具”的演进,具体定义和定位如下:

1. Spring(核心框架)

  • 本质:一个Java EE的基础开发框架,核心是IoC(控制反转) 和AOP(面向切面编程) 两大思想。

  • 作用:解决Java开发中“对象创建、依赖管理、代码解耦”等基础问题,比如通过IoC容器自动管理对象,通过AOP简化日志、事务等重复代码。

  • 特点:功能基础但灵活,可单独用于后端开发,但需要手动配置大量XML或注解,上手成本较高。

2. Spring MVC(Web子框架)

  • 本质:Spring框架的一个Web模块,专注于解决Java Web开发中的“请求处理、页面跳转、参数传递”等问题。

  • 作用:实现了MVC(Model-View-Controller)设计模式,比如:

    Controller:接收前端请求,调用业务逻辑; Model:处理业务数据; View:返回页面或数据(如JSP、JSON)。

  • 特点:依赖Spring核心框架,需与Spring整合配置,是早期Java Web开发的主流方案(如SSM框架:Spring + Spring MVC + MyBatis)。

3. Spring Boot(简化工具)

  • 本质:基于Spring和Spring MVC的“快速开发脚手架”,核心是“自动配置”和“** starters依赖**”。

  • 作用:解决Spring开发中“配置繁琐、依赖冲突”的痛点,比如:

  • 自动配置:无需手动写XML,框架根据依赖jar包自动配置环境(如自动配置Tomcat、数据库连接池);

  • starters依赖:一个依赖(如spring-boot-starter-web)包含Spring MVC、Tomcat等所有Web开发所需组件,无需手动引入多个jar。

  • 特点:开箱即用,大幅简化开发流程,是当前微服务和Java后端开发的主流工具。

三者关系总结

包含关系:Spring是基础,Spring MVC是Spring的Web子模块,Spring Boot整合了Spring和Spring MVC,并增加了自动配置能力。

三者关系图:

graph TD
    A[Spring Framework] --> B[核心功能: IoC, AOP, 事务等];
    A --> C[众多模块];
    C --> D[Spring MVC Web模块];

    E[Spring Boot] --> F[核心思想: 约定优于配置];
    E --> G[自动配置 Auto-Configuration];
    E --> H[起步依赖 Starters];
    E --> I[内嵌服务器 Embedded Server];

    D -.-> G;
    A -.-> G;
    
    style A fill:#f9f,stroke:#333,stroke-width:2px
    style D fill:#ccf,stroke:#333,stroke-width:2px
    style E fill:#9f9,stroke:#333,stroke-width:2px

    J[现代Spring应用] --> E;
    J --> D;
    J --> A;

演进逻辑:从“需要手动配置的基础框架(Spring)”→“专注Web开发的子框架(Spring MVC)”→“一键式快速开发工具(Spring Boot)”,核心是降低开发复杂度、提高效率。

分层示意图:

graph BT
    subgraph Modern Spring Boot Application [现代Spring Boot应用]
        direction BT
        L4[你的业务代码] --> L3;
        subgraph L3 [Spring Boot]
            L3_1[自动配置] --> L2;
            L3_2[起步依赖] -- 引入 --> L2_2;
            L3_3[执行引擎: 内嵌Tomcat/Jetty] -- 托管 --> L2_1;
        end
        subgraph L2 [Spring Framework]
            L2_2[Spring Core: IoC Container, AOP, Events...] -- 基础支撑 --> L2_1;
            L2_1[Spring MVC Module] -- 处理请求/响应 --> L2_2;
        end
    end

    style L2 fill:#ff9,stroke:#333,stroke-width:1px
    style L3 fill:#9f9,stroke:#333,stroke-width:2px
    style L2_1 fill:#ccf,stroke:#333,stroke-width:2px