一、Spring Boot 概述
Spring Boot 是 Spring 生态下的快速应用开发脚手架,基于「约定优于配置(Convention over Configuration)」的核心理念,对 Spring 全家桶进行了高度封装与默认化配置,目的是解决传统 Spring 项目配置繁琐、依赖版本冲突、部署复杂等痛点,让开发者可以快速搭建可独立运行的生产级 Spring 应用。
简单来说:它不是新的框架,也不替代 Spring MVC、Spring 等原有框架,而是把它们整合并自动配置好,开箱即用,开发者只需关注业务逻辑本身。
核心解决的痛点
- 传统 Spring 项目需要编写大量 XML / Java 配置文件
- 手动导入大量依赖,容易出现版本不兼容
- 部署需要额外安装 Tomcat 等容器,打 WAR 包部署
- 项目监控、健康检查等生产能力需要额外集成
二、核心特性
-
起步依赖(Starter) 官方提供了一系列「依赖集合包」,引入一个 Starter 即可自动导入对应场景的全套依赖,且版本自动兼容,无需手动管理一堆 jar 包。
-
自动配置 基于条件注解,根据项目中引入的依赖,自动完成 Spring MVC、数据源、事务等组件的默认配置,绝大多数场景零配置即可运行。
-
内嵌 Servlet 容器 默认内嵌 Tomcat,也支持 Jetty、Undertow,应用可直接打成可执行 JAR 包,通过
java -jar一键启动,无需额外安装 Web 容器。 -
零 XML 配置 全程使用注解和 Java 配置类完成所有配置,摒弃繁琐的 XML 配置文件。
-
生产级能力 原生提供健康检查、指标监控、配置外化、链路追踪等生产环境必备能力。
-
多环境原生支持 内置多环境配置切换机制,可快速切换开发、测试、生产环境。
三、快速入门(完整步骤 + 代码)
1. 环境要求
- JDK 8 / 11 / 17(Spring Boot 3.x 要求 JDK 17+)
- Maven 3.6+ 或 Gradle
2. 创建项目
两种主流方式:
- 方式一:官网生成 Spring Initializr,选择依赖后下载项目压缩包导入 IDE
- 方式二:IDE(IDEA)内置 Spring Initializr 向导直接创建
3. 引入核心依赖
在 pom.xml 中引入 Web 场景 Starter,即可自动集成 Spring MVC、Tomcat 等全套 Web 开发能力:
xml
<!-- 父工程:统一管理所有依赖版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
<relativePath/>
</parent>
<dependencies>
<!-- Web 场景起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
4. 编写启动类
Spring Boot 项目的入口,一个项目有且仅有一个启动类,通常放在根包下:
java
运行
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
}
5. 编写业务接口
和 Spring MVC 用法完全一致,直接写 Controller 即可:
java
运行
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping
public String hello() {
return "Hello Spring Boot!";
}
}
6. 启动与访问
直接运行启动类的 main 方法,控制台看到启动日志后,浏览器访问 http://localhost:8080/hello 即可看到返回结果。
四、核心配置详解
1. 配置文件格式
Spring Boot 默认读取 resources 目录下的配置文件,支持两种格式:
表格
| 格式 | 文件名 | 特点 |
|---|---|---|
| Properties | application.properties |
键值对格式,层级用点分隔 |
| YAML | application.yml |
缩进层级结构,可读性强,更推荐 |
示例:修改端口和上下文路径
- properties 写法:
properties
server.port=8081
server.servlet.context-path=/boot-demo
- yml 写法:
yaml
server:
port: 8081
servlet:
context-path: /boot-demo
2. 常用基础配置
yaml
server:
port: 8080 # 服务端口
servlet:
context-path: /demo # 项目访问前缀
encoding:
charset: UTF-8 # 请求响应编码
spring:
application:
name: boot-demo # 应用名称
datasource: # 数据源配置(引入jdbc starter后生效)
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
3. 多环境配置
通过 spring.profiles.active 切换环境,对应配置文件命名规则:application-{环境名}.yml
-
新建三个配置文件:
application-dev.yml(开发环境)application-test.yml(测试环境)application-prod.yml(生产环境)
-
在主配置文件中指定激活环境:
yaml
spring:
profiles:
active: dev # 激活开发环境
4. 配置属性注入
把配置文件中的值注入到 Java 代码中,两种常用方式:
方式一:@Value(单个字段注入)
java
运行
@RestController
public class ConfigController {
@Value("${server.port}")
private Integer port;
@GetMapping("/port")
public String getPort() {
return "当前服务端口:" + port;
}
}
方式二:@ConfigurationProperties(批量注入到实体类)
适合一组相关配置,前缀统一:
java
运行
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "user")
public class UserProperties {
private String name;
private Integer age;
private String email;
// getter、setter 省略
}
对应配置文件:
yaml
user:
name: 张三
age: 20
email: zhangsan@example.com
五、起步依赖(Starter)机制
1. 什么是 Starter
Starter 是 Spring Boot 的核心设计之一,本质是「依赖打包集合 + 自动配置类」。引入一个 Starter,就自动引入了该场景所需的全部依赖,并且自动完成默认配置。
例如引入 spring-boot-starter-web,就自动引入了 Spring MVC、Jackson、Tomcat、校验等 Web 开发全套依赖,且版本互相兼容。
2. 常用官方 Starter
表格
| Starter 名称 | 作用 |
|---|---|
spring-boot-starter-web |
Web 开发(Spring MVC + Tomcat + JSON) |
spring-boot-starter-test |
单元测试(JUnit + Mockito) |
spring-boot-starter-data-jpa |
JPA 数据访问 |
spring-boot-starter-jdbc |
JDBC + 事务 |
spring-boot-starter-redis |
Redis 缓存操作 |
spring-boot-starter-amqp |
RabbitMQ 消息队列 |
spring-boot-starter-validation |
参数校验 |
spring-boot-starter-actuator |
应用监控与健康检查 |
spring-boot-starter-security |
安全认证权限控制 |
六、自动配置原理(通俗讲解)
1. 核心注解拆解
启动类上的 @SpringBootApplication 是一个复合注解,包含三个核心注解:
@SpringBootConfiguration:标记为配置类,等价于@Configuration@ComponentScan:自动扫描启动类所在包及其子包下的 Bean(约定:启动类放在根包下)@EnableAutoConfiguration:开启自动配置,是自动配置的核心
2. 自动配置流程
- 项目启动时,
@EnableAutoConfiguration会通过 SPI 机制读取spring.factories文件中所有自动配置类 - 每个自动配置类都带有条件注解(如
@ConditionalOnClass),根据是否引入对应依赖、是否存在对应 Bean 来判断是否生效 - 满足条件的配置类会自动向容器中注入默认配置好的 Bean,完成组件初始化
3. 常用条件注解
@ConditionalOnClass:类路径下存在指定类时生效@ConditionalOnMissingBean:容器中没有指定 Bean 时才创建(允许用户自定义 Bean 覆盖默认配置)@ConditionalOnProperty:配置文件中存在指定属性时生效
七、常用开发场景(衔接 Spring MVC 知识点)
1. 拦截器配置
在 Spring Boot 中无需 XML 配置,直接写配置类即可,和之前介绍的拦截器代码完全兼容:
java
运行
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/user/login");
}
}
2. 全局异常处理
用法和 Spring MVC 完全一致,@RestControllerAdvice 开箱即用:
java
运行
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleException(Exception e) {
return "系统异常:" + e.getMessage();
}
}
3. 静态资源映射
Spring Boot 默认静态资源位置:classpath:/META-INF/resources/、classpath:/resources/、classpath:/static/、classpath:/public/,放在这些目录下的文件可直接通过 URL 访问。
4. 打包与运行
引入打包插件后,直接执行 mvn package 即可打成可执行 JAR 包:
xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
启动命令:
bash
运行
java -jar boot-demo.jar
八、Spring Boot 与 Spring MVC 的关系
- Spring MVC 是 Web 层框架,负责处理 HTTP 请求、参数绑定、响应返回
- Spring Boot 是快速开发脚手架,自动集成并配置好了 Spring MVC
- 传统 Spring MVC 需要手动配置 DispatcherServlet、视图解析器、静态资源映射等
- Spring Boot 中这些全部自动配置完成,开发者只需写业务代码,零配置即可使用 Spring MVC 的全部能力
Spring MVC、Spring、Spring Boot
一、三者的核心含义与定位
三者是递进包含、各司其职的关系,并非互斥的技术选型,而是 Spring 生态从「底层核心」到「Web 层扩展」再到「工程化脚手架」的完整演进。
1. Spring Framework(常简称 Spring)
定位:整个 Spring 生态的底层核心容器 + 企业级开发基础框架
它是 2003 年为解决传统 Java EE(EJB)开发笨重、耦合度高的问题而诞生的轻量级框架,核心目标是管理 Java 对象的生命周期、解耦业务组件,并提供企业级开发的通用能力。
核心能力
- IOC(控制反转)容器:由 Spring 容器负责创建、装配对象,开发者无需手动 new 对象和管理依赖,通过 DI(依赖注入)实现组件解耦。这是 Spring 最核心的根基。
- AOP(面向切面编程):不修改业务代码即可实现日志、事务、权限等横切逻辑的统一植入。
- 事务管理:提供声明式事务,通过注解即可控制数据库事务,无需手动编写事务提交 / 回滚代码。
- 数据访问封装:提供 Spring JDBC、Spring ORM 等模块,简化数据库操作,统一异常体系。
- 框架集成能力:可以无缝整合 MyBatis、Redis、RabbitMQ 等第三方框架。
解决的问题
传统 Java 开发中,对象创建、依赖关系全靠手动维护,代码耦合度高、扩展困难;事务、日志等通用逻辑散落在业务代码中,复用性差。Spring 通过 IOC+AOP 统一解决了这些问题。
一句话总结
Spring 是「工具箱 + 对象管家」,提供了企业级开发的所有基础能力,但本身不负责 Web 请求处理,也不提供开箱即用的配置。
2. Spring MVC
定位:Spring Framework 内置的「Web 层开发子框架」,基于 MVC 设计模式实现
它是 Spring 生态专门用来处理 HTTP 请求的模块,属于 Spring 的一部分,不能脱离 Spring 核心容器独立运行。在 Spring Boot 出现之前,它是 Java Web 开发的主流方案。
核心能力
- 请求路由:通过
@RequestMapping等注解建立 URL 与 Java 方法的映射 - 参数绑定:自动将请求参数、JSON 请求体封装为 Java 对象
- 视图解析:支持 JSP、Thymeleaf 等模板引擎的页面渲染
- 拦截器、全局异常处理、文件上传下载等 Web 层通用能力
- 核心调度中枢:
DispatcherServlet(前端控制器)统一接收分发请求
解决的问题
原生 Servlet 开发需要每个请求对应一个 Servlet 类,配置繁琐,参数解析、响应封装都要手动处理,代码冗余且没有统一架构规范。Spring MVC 基于 MVC 模式规范了 Web 层代码结构,大幅简化 Web 开发。
一句话总结
Spring MVC 是 Spring 工具箱里专门处理「Web 请求」的工具,只负责 Web 层的请求接收、参数处理、响应返回,业务层和对象管理依然依赖 Spring 核心。
3. Spring Boot
定位:基于 Spring 生态的「快速开发脚手架 / 约定化框架」,不是新框架,是 Spring 的增强工具
它诞生于 2014 年,核心理念是约定优于配置,目的是解决传统 Spring + Spring MVC 项目配置繁琐、依赖版本冲突、部署复杂的痛点,让开发者可以几分钟搭建出一个可运行的生产级 Spring 应用。
核心能力
- 起步依赖(Starter) :一个依赖打包集合,引入
spring-boot-starter-web就自动导入 Spring MVC、Tomcat、Jackson 等全套 Web 依赖,无需手动管理版本。 - 自动配置:根据项目引入的依赖,自动完成 Spring MVC、数据源、事务等组件的默认配置,绝大多数场景零配置即可运行。
- 内嵌 Servlet 容器 :默认内嵌 Tomcat,应用可直接打成可执行 JAR 包,通过
java -jar启动,无需额外安装 Web 容器。 - 生产级特性:内置健康检查、指标监控、配置外化等能力。
- 多环境原生支持:通过配置文件快速切换开发 / 测试 / 生产环境。
解决的问题
传统 SSM(Spring + Spring MVC + MyBatis)项目需要编写大量 XML 配置文件,手动管理几十个依赖的版本兼容性,部署需要外置 Tomcat 打 WAR 包,搭建一个新项目往往需要半天甚至一天。Spring Boot 把这些全部自动化了。
一句话总结
Spring Boot 不是替代 Spring 和 Spring MVC,而是把它们「打包并配置好」,帮你省掉所有重复配置工作,让你直接写业务代码。它的底层 100% 还是 Spring + Spring MVC。
二、三者核心区别对比
表格
| 对比维度 | Spring Framework | Spring MVC | Spring Boot |
|---|---|---|---|
| 核心定位 | 底层核心容器 + 企业级开发基础框架 | Spring 生态的 Web 层子框架 | Spring 应用快速开发脚手架 |
| 所属关系 | 独立的完整框架,是生态基石 | Spring Framework 的一个子模块 | 基于 Spring + Spring MVC 的增强工具 |
| 核心功能 | IOC 容器、AOP、事务管理、数据访问、组件集成 | 请求映射、参数绑定、视图解析、拦截器、Web 请求处理 | 起步依赖、自动配置、内嵌容器、生产监控 |
| 解决的核心问题 | 解耦业务组件,统一企业级开发能力 | 简化 Web 层开发,规范 MVC 架构 | 简化 Spring 项目的搭建、配置与部署 |
| 配置方式 | 需手动编写 XML/Java 配置类,全量配置 | 需手动配置 DispatcherServlet、视图解析器等 | 约定默认配置,仅需修改少量自定义配置 |
| 部署方式 | 需外置 Servlet 容器,打 WAR 包部署 | 同 Spring,需外置容器 | 内嵌 Tomcat/Jetty,打 JAR 包直接运行 |
| 学习门槛 | 高,需理解 IOC、AOP 及大量配置 | 中,需理解请求流程和注解用法 | 低,开箱即用,快速上手 |
| 诞生时间 | 2003 年 | 2.0 版本后逐步完善 | 2014 年 |
| 能否独立使用 | 可以,可只做业务层管理,不做 Web 开发 | 不能,必须依赖 Spring 核心容器 | 不能,底层完全依赖 Spring 生态 |
三、三者的关系梳理
用层级关系可以清晰表达:
plaintext
最上层:Spring Boot(脚手架,帮你自动组装下面两层)
↓ 封装并自动配置
中间层:Spring MVC(Web层模块,处理HTTP请求)
↓ 依赖
最底层:Spring Framework(核心容器,管理所有Bean、事务、AOP等)
通俗类比
- Spring Framework = 一套完整的乐高基础零件库(积木块、齿轮、连接件),可以拼出任何东西,但需要你自己设计图纸、逐个拼接。
- Spring MVC = 乐高零件库里专门用来拼「Web 网站」的零件套装,包含路由、参数、视图等专用零件,必须用基础零件库才能玩。
- Spring Boot = 官方出的「乐高成品套装」,已经帮你把基础零件、Web 零件都按默认规格拼好了主体框架,你只需要往上面加自己的业务零件就行,不用从零开始搭底座。
四、常见误区澄清
-
误区:Spring Boot 是替代 Spring 的新框架 错误。Spring Boot 没有任何新的技术内核,它只是做了「默认配置」和「依赖打包」,底层运行的依然是 Spring Framework 和 Spring MVC。你在 Spring 里能用的所有注解、能力,在 Spring Boot 里完全通用。
-
误区:Spring MVC 是独立框架,可以脱离 Spring 使用 错误。Spring MVC 是 Spring 的一个模块,它的 Controller 对象需要交给 Spring IOC 容器管理,依赖注入、事务等能力都依赖 Spring 核心,无法单独运行。
-
误区:现在用 Spring Boot 就不用学 Spring 和 Spring MVC 了 错误。Spring Boot 只是简化了配置,核心逻辑还是 Spring 和 Spring MVC。遇到自定义配置、底层问题时,依然需要理解 Spring 的 IOC、Bean 生命周期、Spring MVC 的请求流程才能排查问题。
五、实际开发中的使用现状
现在企业级 Java Web 开发的标准组合是: Spring Boot 构建项目 + Spring MVC 处理 Web 请求 + Spring 核心管理业务 Bean + 其他 Spring 生态组件(事务、缓存、消息等)
开发者日常写的 Controller 属于 Spring MVC 的内容,Service、Dao 由 Spring IOC 容器管理,而整个项目的搭建、配置、运行都由 Spring Boot 来完成,三者是协同工作的关系,而非三选一。