Spring Boot

一、Spring Boot 概述

Spring Boot 是 Spring 生态下的快速应用开发脚手架,基于「约定优于配置(Convention over Configuration)」的核心理念,对 Spring 全家桶进行了高度封装与默认化配置,目的是解决传统 Spring 项目配置繁琐、依赖版本冲突、部署复杂等痛点,让开发者可以快速搭建可独立运行的生产级 Spring 应用。

简单来说:它不是新的框架,也不替代 Spring MVC、Spring 等原有框架,而是把它们整合并自动配置好,开箱即用,开发者只需关注业务逻辑本身。

核心解决的痛点
  • 传统 Spring 项目需要编写大量 XML / Java 配置文件
  • 手动导入大量依赖,容易出现版本不兼容
  • 部署需要额外安装 Tomcat 等容器,打 WAR 包部署
  • 项目监控、健康检查等生产能力需要额外集成

二、核心特性

  1. 起步依赖(Starter) 官方提供了一系列「依赖集合包」,引入一个 Starter 即可自动导入对应场景的全套依赖,且版本自动兼容,无需手动管理一堆 jar 包。

  2. 自动配置 基于条件注解,根据项目中引入的依赖,自动完成 Spring MVC、数据源、事务等组件的默认配置,绝大多数场景零配置即可运行。

  3. 内嵌 Servlet 容器 默认内嵌 Tomcat,也支持 Jetty、Undertow,应用可直接打成可执行 JAR 包,通过 java -jar 一键启动,无需额外安装 Web 容器。

  4. 零 XML 配置 全程使用注解和 Java 配置类完成所有配置,摒弃繁琐的 XML 配置文件。

  5. 生产级能力 原生提供健康检查、指标监控、配置外化、链路追踪等生产环境必备能力。

  6. 多环境原生支持 内置多环境配置切换机制,可快速切换开发、测试、生产环境。


三、快速入门(完整步骤 + 代码)

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

  1. 新建三个配置文件:

    • application-dev.yml(开发环境)
    • application-test.yml(测试环境)
    • application-prod.yml(生产环境)
  2. 在主配置文件中指定激活环境:

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. 自动配置流程
  1. 项目启动时,@EnableAutoConfiguration 会通过 SPI 机制读取 spring.factories 文件中所有自动配置类
  2. 每个自动配置类都带有条件注解(如 @ConditionalOnClass),根据是否引入对应依赖、是否存在对应 Bean 来判断是否生效
  3. 满足条件的配置类会自动向容器中注入默认配置好的 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 零件都按默认规格拼好了主体框架,你只需要往上面加自己的业务零件就行,不用从零开始搭底座。

四、常见误区澄清

  1. 误区:Spring Boot 是替代 Spring 的新框架 错误。Spring Boot 没有任何新的技术内核,它只是做了「默认配置」和「依赖打包」,底层运行的依然是 Spring Framework 和 Spring MVC。你在 Spring 里能用的所有注解、能力,在 Spring Boot 里完全通用。

  2. 误区:Spring MVC 是独立框架,可以脱离 Spring 使用 错误。Spring MVC 是 Spring 的一个模块,它的 Controller 对象需要交给 Spring IOC 容器管理,依赖注入、事务等能力都依赖 Spring 核心,无法单独运行。

  3. 误区:现在用 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 来完成,三者是协同工作的关系,而非三选一。

相关推荐
xiaogai_gai1 小时前
钉钉数据集成到金蝶云星空案例分享:传给钉钉后,回传金蝶字段
java·前端·钉钉
摇滚侠1 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 19-25
java·云原生·kubernetes
标致的钢铁侠1 小时前
c# 温故而知新: 线程篇(一)
java·jvm·c#
宠友信息1 小时前
资源权限与钱包流水在即时通讯源码后端架构中的设计
java·spring boot·redis·websocket·缓存
不知名的老吴1 小时前
浅谈:编程语言中的那些「锁」事(二)
java·开发语言
程序员小八7771 小时前
AOP 切面
java
地铁潜行者2 小时前
从单体思维到微服务:服务拆分与组件选型实践
java·后端
花生了什么事o2 小时前
线程池参数调优:corePoolSize 怎么设置
java·后端
想要成为糕糕手2 小时前
🚀 从零玩转 Agent 开发:原理、架构与框架实战完全指南
后端