Spring Boot核心知识点

5 阅读23分钟

Spring Boot 是基于 Spring Framework 开发的快速开发脚手架,核心理念是「约定优于配置(Convention Over Configuration)」,通过自动配置、起步依赖等特性,简化 Spring 应用的搭建、开发、部署流程,无需手动编写繁琐的 XML 配置,让开发者专注于业务逻辑实现。本文将从核心原理、核心特性、实战要点三个维度,全面解析 Spring Boot 核心知识点,并详细对比 1.x、2.x、3.x 三个主要版本的具体区别,兼顾深度(底层原理、源码级细节)与广度(应用场景、生态扩展)。

一、Spring Boot 核心知识点(深度+广度)

1.1 核心设计理念

Spring Boot 的所有特性均围绕「简化开发、降低复杂度、提升效率」展开,核心设计理念有3个,是理解其所有功能的基础:

  • 约定优于配置(Convention Over Configuration) :Spring Boot 预设了一套合理的默认配置(如默认端口8080、默认数据源配置、默认包扫描规则),开发者无需手动配置,仅在需要自定义时修改相关配置,大幅减少配置工作量。例如,引入 spring-boot-starter-web 后,自动配置 Tomcat、DispatcherServlet 等 Web 核心组件,无需手动注册。
  • 自动配置(Auto Configuration) :Spring Boot 会根据类路径下的依赖、配置文件等信息,自动初始化 Bean、配置组件,实现「按需加载」。例如,类路径下存在mysql-connector-java 依赖时,自动配置数据源相关 Bean;存在 spring-boot-starter-data-redis 依赖时,自动配置 RedisTemplate 等组件,核心是通过条件注解实现灵活的配置加载。
  • 嵌入式容器(Embedded Container) :内置 Tomcat、Jetty、Undertow 等 Web 容器,无需单独部署 WAR 包到外部容器,直接通过 JAR 包即可启动应用,简化部署流程,提升开发、测试效率,也是 Spring Boot 实现「一键启动」的核心支撑。

1.2 核心底层原理(深度解析)

Spring Boot 并非对 Spring 的替代,而是在 Spring Framework 基础上进行封装,核心底层依赖 Spring IoC、AOP 特性,同时新增了自动配置、起步依赖等核心机制,以下是3个核心原理的深度拆解:

1.2.1 自动配置原理(Spring Boot 灵魂)

自动配置是 Spring Boot 最核心的功能,其底层实现依赖「注解驱动 + 条件判断 + 配置加载」,完整流程如下(源码级简化):

  1. 入口注解触发:Spring Boot 应用的入口是带有 @SpringBootApplication 注解的主类,该注解是一个组合注解,核心包含3个注解,共同触发自动配置机制:

    1. @SpringBootConfiguration:本质是 @Configuration 的特殊形式,标识当前类是配置类,允许在类中通过 @Bean 注解注册组件。
    2. @ComponentScan:自动扫描当前类所在包及其子包下的 @Component@Service@Controller 等注解,将其注册到 IoC 容器中。
    3. @EnableAutoConfiguration:开启自动配置的核心注解,通过 @Import(AutoConfigurationImportSelector.class) 导入自动配置选择器,触发自动配置类的加载。
  2. 自动配置类加载AutoConfigurationImportSelector 类通过SpringFactoriesLoader 加载类路径下 META-INF/spring.factories(1.x、2.x)或 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(3.x)文件中注册的自动配置类(如 WebMvcAutoConfigurationDataSourceAutoConfiguration)。

  3. 条件过滤:自动配置类通过@Conditional 系列注解(如 @ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty)进行条件判断,只有满足条件的自动配置类才会生效。例如,WebMvcAutoConfiguration 会通过 @ConditionalOnWebApplication 注解,仅在 Web 应用中生效;DataSourceAutoConfiguration 会通过 @ConditionalOnClass(DataSource.class) 注解,仅在类路径存在 DataSource 类时生效。

  4. 配置绑定:自动配置类会读取配置文件(application.properties/application.yml)中的参数,通过 @ConfigurationProperties 注解绑定到对应的配置类中,实现配置的灵活定制。例如,ServerProperties 类绑定 server.portserver.servlet.context-path 等配置,DataSourceProperties 类绑定数据库相关配置。

核心关键点:自动配置的本质是「Spring IoC 容器的Bean注册 + 条件过滤」,默认配置可通过自定义配置文件、自定义配置类覆盖,实现「约定优先、自定义可选」的灵活机制。

1.2.2 起步依赖原理(Starter)

起步依赖(Starter)是 Spring Boot 简化依赖管理的核心机制,本质是「Maven/Gradle 依赖描述文件」,通过打包一组相关的依赖库并提供默认配置,让开发者无需手动引入多个零散依赖,就能快速集成某类功能,核心价值的是简化依赖引入、避免版本冲突、支持自动配置。

核心原理与细节:

  • 命名规范:官方 Starter 命名遵循spring-boot-starter-xxx(如 spring-boot-starter-webspring-boot-starter-jdbc),第三方 Starter 命名通常遵循 xxx-spring-boot-starter(如 mybatis-spring-boot-starter)。
  • 底层实现:Starter 本身不包含业务代码,而是在其 pom.xml 中声明了功能所需的所有核心依赖和传递依赖,Spring Boot 通过父工程 spring-boot-dependencies 统一管理所有 Starter 的依赖版本,避免版本冲突。例如,spring-boot-starter-webpom.xml 会自动引入 Spring MVC、嵌入式 Tomcat、Jackson JSON 解析器等依赖,无需开发者手动逐个添加。
  • 自动配置关联:Starter 通常会关联一个或多个自动配置类,这些配置类通过 spring.factories(1.x、2.x)或 AutoConfiguration.imports(3.x)文件注册,当引入 Starter 后,自动配置类会自动生效,完成组件的初始化配置。例如,引入 spring-boot-starter-web后,WebMvcAutoConfiguration 会自动生效,配置 Tomcat、DispatcherServlet 等核心 Web 组件。
  • 自定义 Starter:开发者可根据业务需求自定义 Starter,核心步骤是:创建 Maven 项目,在 pom.xml 中引入所需依赖;编写自动配置类,通过条件注解控制生效时机;编写 spring.factoriesAutoConfiguration.imports 文件,注册自动配置类;打包发布,供其他项目引入复用。

1.2.3 嵌入式容器原理

Spring Boot 内置 Tomcat(默认)、Jetty、Undertow 三种 Web 容器,无需外部部署,核心原理是「将容器集成到应用中,通过代码启动容器」,具体流程:

  1. 依赖加载:引入 spring-boot-starter-web 时,默认引入 spring-boot-starter-tomcat 依赖(Tomcat 容器),若需切换容器,可排除 Tomcat 依赖,引入 Jetty 或 Undertow 依赖。
  2. 容器初始化:Spring Boot 启动时,通过 EmbeddedWebApplicationContext 初始化嵌入式容器,加载容器配置(如端口、上下文路径、线程池参数),这些配置可通过 application.yml 自定义(如 server.port=8081)。
  3. 应用部署:容器初始化完成后,将 Spring 应用上下文关联到容器中,监听指定端口,接收 HTTP 请求,实现「一键启动」。

核心优势:简化部署流程,无需安装外部容器;支持容器灵活切换,适配不同性能需求(如 Undertow 性能优于 Tomcat,适合高并发场景)。

1.3 核心特性(广度覆盖)

Spring Boot 的核心特性围绕「简化开发、提升效率、增强扩展性」展开,涵盖开发、测试、部署全流程,以下是常用核心特性的详细解析:

1.3.1 外部化配置

外部化配置是 Spring Boot 实现「配置与代码分离」的核心特性,支持多种配置方式,优先级从高到低排序(后加载的配置会覆盖先加载的配置):

  • 命令行参数:启动应用时通过 --server.port=8081 等参数指定配置,优先级最高。
  • 环境变量:系统环境变量(如 SPRING_SERVER_PORT=8081),适配不同环境的配置隔离。
  • 配置文件:application.yml(推荐,语法简洁)、application.properties,支持多环境配置(如 application-dev.ymlapplication-prod.yml),通过 spring.profiles.active=dev 指定激活的环境。
  • 配置中心:集成 Spring Cloud Config、Nacos 等配置中心,实现分布式环境下的配置统一管理、动态刷新(适用于微服务场景)。

核心注解:@ConfigurationProperties(批量绑定配置文件参数到 Java 类)、@Value(单个注入配置参数,支持 SpEL 表达式),例如通过 @ConfigurationProperties(prefix = "spring.datasource") 可将数据库配置批量绑定到 DataSourceProperties 类中。

1.3.2 Spring Boot Starter 生态

Starter 是 Spring Boot 生态的核心,官方提供了大量 Starter,覆盖 Web 开发、数据访问、安全、监控等常见场景,第三方也提供了丰富的 Starter(如 MyBatis、Redis、RabbitMQ 等),常用官方 Starter 如下:

  • spring-boot-starter:核心 Starter,包含 Spring Boot 核心功能(自动配置、日志、YAML 解析等),所有其他 Starter 都依赖此 Starter。
  • spring-boot-starter-web:Web 开发 Starter,集成 Spring MVC、嵌入式 Tomcat、Jackson 等,用于快速开发 Web 应用。
  • spring-boot-starter-data-jpa:数据访问 Starter,集成 Spring Data JPA、Hibernate,简化数据库操作。
  • spring-boot-starter-jdbc:JDBC Starter,集成 Spring JDBC、数据源(默认 HikariCP,2.x 及以上),用于原生 JDBC 开发。
  • spring-boot-starter-redis:Redis Starter,集成 Spring Data Redis、Redis 客户端(默认 Lettuce,2.x 及以上),简化 Redis 操作。
  • spring-boot-starter-security:安全 Starter,集成 Spring Security,实现身份认证、权限控制。
  • spring-boot-starter-actuator:监控 Starter,提供应用健康检查、指标监控、接口调用统计等功能,用于应用运维监控。

1.3.3 监控与运维(Actuator)

Spring Boot Actuator 是用于应用监控和运维的核心组件,通过暴露 HTTP 端点,提供应用的运行状态、指标统计、健康检查等功能,帮助开发者快速定位问题,核心特性:

  • 核心端点:

    • /actuator/health:应用健康检查,返回应用是否正常运行,支持自定义健康检查逻辑(如数据库连接、Redis 连接检查)。
    • /actuator/info:应用信息,可配置应用名称、版本、作者等信息。
    • /actuator/metrics:应用指标,如 JVM 内存使用、CPU 使用率、HTTP 请求数、接口响应时间等。
    • /actuator/loggers:日志管理,可动态修改日志级别(无需重启应用)。
    • /actuator/shutdown:应用关闭(默认禁用,需手动开启),支持优雅关闭应用。
  • 扩展能力:可集成 Micrometer(指标收集工具),对接 Prometheus、Grafana 等监控平台,实现指标可视化、告警等功能;3.x 版本深度集成 Micrometer Tracing,支持分布式追踪(如 Brave、OpenTelemetry),适配微服务监控场景。

1.3.4 测试支持

Spring Boot 内置完善的测试支持,通过 spring-boot-starter-test Starter,集成 JUnit、Mockito、Spring Test 等测试框架,支持单元测试、集成测试、Mock 测试,核心注解:

  • @SpringBootTest:启动 Spring 应用上下文,用于集成测试(如测试 Service、Dao 层,自动注入依赖)。
  • @WebMvcTest:仅启动 Web 层上下文,用于测试 Controller 层,无需启动完整应用。
  • @MockBean:Mock 容器中的 Bean,用于隔离依赖(如 Mock Dao 层,避免依赖数据库)。
  • @TestPropertySource:指定测试环境的配置文件,用于测试环境与生产环境的配置隔离。

1.3.5 其他核心特性

  • 热部署:通过 spring-boot-devtools 依赖,实现代码修改后自动重启应用,提升开发效率(开发环境使用,生产环境禁用);3.x 版本对 DevTools 进行了改进,支持热重载(LiveReload)和更高效的自动重启机制。
  • 异步处理:通过 @Async 注解标记方法为异步方法,配合 @EnableAsync 注解开启异步支持,实现异步调用(如异步发送邮件、异步处理日志),提升应用响应速度。
  • 定时任务:通过 @Scheduled 注解标记定时任务方法,配合 @EnableScheduling 注解开启定时任务支持,支持 cron 表达式、固定延迟、固定速率等定时方式。
  • 安全支持:集成 Spring Security,提供身份认证、权限控制、CSRF 防护等功能,可快速实现用户登录、接口权限校验;3.x 版本集成 Spring Security 6.x,默认启用更强的安全策略,支持 OAuth2 和 JWT 的更简洁配置。
  • 响应式编程:2.x 版本引入 WebFlux(基于 Reactor 框架),支持响应式编程,适用于高并发、IO 密集型场景,与传统的 Spring MVC(同步阻塞)形成互补;3.x 版本进一步优化了响应式编程的支持,适配 Jakarta EE 规范。

1.4 实战核心要点(深度+实战)

结合实际开发场景,梳理 Spring Boot 实战中的核心要点,解决开发中常见的问题,提升开发效率和应用质量:

1.4.1 自动配置的自定义覆盖

Spring Boot 的默认自动配置可通过以下3种方式覆盖,满足自定义需求:

  • 自定义配置文件:在 application.yml/application.properties 中修改默认配置(如 server.port=8081spring.datasource.url=jdbc:mysql://localhost:3306/test)。
  • 自定义配置类:编写带有 @Configuration 注解的配置类,注册自定义 Bean,覆盖默认自动配置的 Bean(如自定义数据源、自定义 RedisTemplate);若需完全禁用某个自动配置类,可通过 @SpringBootApplication(exclude = 自动配置类.class) 排除(如 exclude = DataSourceAutoConfiguration.class)。
  • 自定义 Starter:通过自定义 Starter,封装项目通用配置(如公司内部的数据库配置、缓存配置),实现配置复用,减少重复开发。

1.4.2 依赖管理与版本控制

  • 父工程依赖:Spring Boot 项目通常继承 spring-boot-starter-parent 父工程,该父工程统一管理所有 Starter 的依赖版本,避免版本冲突;若项目无法继承父工程,可通过 dependencyManagement 标签引入 spring-boot-dependencies,手动管理版本。
  • 依赖排除:当引入的 Starter 包含不需要的依赖时,可通过 exclusions 标签排除(如排除 Tomcat 依赖,切换为 Jetty 容器)。
  • 版本升级:升级 Spring Boot 版本时,需注意依赖的兼容性(如 Spring Boot 3.x 依赖 Spring Framework 6.x,需升级相关依赖到对应版本);可通过 mvn dependency:tree 分析依赖树,排查版本冲突问题。

1.4.3 应用部署与优化

  • 部署方式:

    • JAR 包部署(推荐):通过 mvn package 打包为 JAR 包,直接通过 java -jar xxx.jar 启动,无需外部容器,适配云原生部署(如 Docker、K8s)。
    • WAR 包部署:修改打包方式为 WAR,排除内置容器依赖,部署到外部 Tomcat、Jetty 容器(适用于传统部署场景)。
    • 原生镜像部署(3.x 新增):通过 GraalVM 将应用编译为原生可执行文件,实现毫秒级启动、内存占用降低 50%+,适合 Serverless、FaaS 场景,通过 native-maven-plugin 可直接构建原生镜像。
  • 性能优化:

    • 容器优化:切换为 Undertow 容器,提升高并发场景下的性能;优化容器线程池参数(如 Tomcat 的最大线程数、队列大小)。
    • 数据源优化:配置合理的连接池参数(如 HikariCP 的最大连接数、连接超时时间),避免连接池不足或浪费。
    • JVM 优化:设置合理的 JVM 内存参数(如堆内存、元空间大小),避免内存溢出、GC 频繁。
    • AOT 编译(3.x 新增):引入 AOT(Ahead-of-Time)编译,将反射、代理等运行时行为提前编译为静态代码,提升应用启动速度和运行性能,通过 @ImportRuntimeHints 注解显式声明运行时依赖。

1.4.4 常见问题解决方案

  • 自动配置失效:检查是否引入对应的 Starter、是否排除了自动配置类、是否满足自动配置的条件(如类路径是否存在对应依赖)。
  • 依赖冲突:通过 mvn dependency:tree 分析依赖树,找到冲突的依赖,通过 exclusions 排除冲突依赖,或指定依赖版本。
  • 端口冲突:修改 server.port 配置,或停止占用该端口的进程。
  • 配置文件不生效:检查配置文件路径是否正确(默认放在 src/main/resources 下)、配置参数是否正确(如语法错误、前缀错误)、是否激活了对应的环境配置。
  • 同一类中方法调用 AOP 增强失效:由于 Spring AOP 基于动态代理,同一类中方法调用时,调用的是目标对象自身的方法,而非代理对象的方法,可通过自注入(配合 @Lazy 注解)或 ApplicationContext 获取代理对象解决。

二、Spring Boot 1.x、2.x、3.x 具体区别(重点拆解)

Spring Boot 自 2014 年发布 1.0 版本以来,经历了 1.x、2.x、3.x 三个主要大版本的迭代,每个版本都伴随着底层依赖升级、核心特性新增、API 调整,以下从「底层依赖、核心特性、API 变更、适用场景」四个维度,详细对比三个版本的具体区别,兼顾实用性和深度,帮助开发者选择合适的版本:

2.1 整体版本迭代概览

版本系列发布时间范围基于 Spring Framework 版本最低 Java 版本要求最高支持 Java 版本核心定位现状
1.x2014 – 20184.xJava 6/7Java 8快速启动、简化配置,奠定「约定优于配置」的核心理念,实现 Spring 应用的快速搭建已停止维护(1.5.x 于 2019 年 8 月 EOL),不建议新项目使用,仅存量系统维护
2.x2018 – 20235.xJava 8Java 19(2.7+)性能优化、响应式支持、云原生准备,完善生态,提升稳定性和扩展性2.7.x 是最后一个 2.x 版本,2023 年 11 月停止 OSS 支持(商业支持延续),存量系统广泛使用,新项目不推荐
3.x2022 – 至今6.xJava 17(LTS)Java 21+(推荐)现代化重构,拥抱 Jakarta EE、GraalVM、Java 17+,优化性能和可观测性,适配云原生和微服务当前主流版本,官方持续维护,新项目首选,支持更多现代化特性

2.2 核心维度具体区别(深度拆解)

2.2.1 底层依赖与环境要求

  • Spring Framework 依赖

    • 1.x:基于 Spring Framework 4.x,依赖 Java 6/7,兼容 Java 8,不支持 Java 9+ 新特性。
    • 2.x:基于 Spring Framework 5.x,依赖 Java 8(最低),支持 Java 9-19,引入了 Spring 5.x 的核心特性(如响应式编程、函数式编程、注解驱动开发增强)。
    • 3.x:基于 Spring Framework 6.x,依赖 Java 17(最低,强制要求),推荐 Java 21,利用 Java 17+ 新特性(如 record 不可变类、sealed class 密封类、pattern matching 模式匹配)优化框架内部逻辑,不兼容 Java 8/11 等旧版本。
  • Java EE / Jakarta EE 依赖

    • 1.x / 2.x:依赖 Java EE(如 Servlet 3.0+、JPA 2.0+),包名使用 javax.*(如 javax.servletjavax.persistence)。
    • 3.x:全面迁移到 Jakarta EE 9+,包名从 javax.* 替换为jakarta.*(如 jakarta.servletjakarta.persistence),所有涉及 Java EE 的依赖(如 Hibernate、Spring Data JPA)需升级到支持 Jakarta EE 9+ 的版本,这是 3.x 最具颠覆性的变更之一。
  • 嵌入式容器版本

    • 1.x:默认 Tomcat 7/8,支持 Jetty 8/9,不支持 Undertow。
    • 2.x:默认 Tomcat 8.5+,支持 Jetty 9+、Undertow 2.x,新增 Undertow 容器支持,提供更好的性能。
    • 3.x:默认 Tomcat 10+(适配 Jakarta EE 9+),支持 Jetty 12+、Undertow 2.3+,容器版本全面升级,适配新的规范和特性,3.2+ 版本支持 Java 21 虚拟线程,提升高并发吞吐能力。

2.2.2 核心特性差异

  • 自动配置机制

    • 1.x:自动配置机制初步完善,通过 spring.factories 文件注册自动配置类,条件注解种类较少,配置灵活性有限。
    • 2.x:增强自动配置机制,新增更多 @Conditional 系列注解(如@ConditionalOnResource@ConditionalOnWebApplication),支持自动配置类的排序(@AutoConfigureBefore/@AutoConfigureAfter),优化配置绑定逻辑,支持宽松绑定(如驼峰、下划线、横杠格式互通)。
    • 3.x:重构自动配置机制,用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件替代传统的 spring.factories 文件,支持多文件合并,避免配置冲突;移除 @ConfigurationProperties 的宽松绑定,仅支持 kebab-case 格式(如下划线格式不再兼容);增强自动配置的性能,减少启动时间。
  • 起步依赖(Starter)

    • 1.x:提供核心 Starter(如 spring-boot-starter-webspring-boot-starter-jdbc),但 Starter 种类较少,第三方 Starter 生态不完善。
    • 2.x:扩展 Starter 生态,新增大量官方 Starter(如 spring-boot-starter-webfluxspring-boot-starter-actuator 增强版),第三方 Starter 快速发展;默认数据源从 Tomcat JDBC 切换为 HikariCP(性能更优);Redis 客户端从 Jedis 切换为 Lettuce(默认)。
    • 3.x:优化 Starter 依赖管理,移除部分过时的 Starter(如 spring-boot-starter-velocity);新增 spring-boot-starter-native,官方支持 GraalVM 原生镜像构建;Starter 依赖的版本全面升级,适配 Jakarta EE 9+ 和 Spring Framework 6.x;简化自定义 Starter 的开发流程,支持自动配置类的批量导入。
  • 响应式编程

    • 1.x:不支持响应式编程,仅支持传统的同步阻塞编程(Spring MVC)。
    • 2.x:新增 WebFlux 模块(基于 Reactor 框架),支持响应式编程,适配高并发、IO 密集型场景;支持响应式数据源(如 R2DBC)、响应式 Redis 等,与 Spring MVC 形成互补;引入 Micrometer 作为统一指标监控门面,替代 Dropwizard Metrics。
    • 3.x:优化 WebFlux 性能,完善响应式生态,支持更多响应式组件;WebFlux 适配 Jakarta EE 9+,与 Spring MVC 共享更多核心组件,提升开发一致性;增强响应式编程的调试和监控能力,集成 Micrometer Tracing 实现分布式追踪。
  • 监控与运维(Actuator)

    • 1.x:Actuator 功能较弱,仅提供基础的健康检查(/health)、应用信息(/info)端点,无安全隔离,监控指标较少。
    • 2.x:重构 Actuator,端点路径统一为/actuator/xxx;支持细粒度安全控制(通过management.endpoints.web.exposure.include 指定暴露的端点);新增大量监控端点(如 /actuator/metrics/actuator/loggers);支持自定义健康检查逻辑;集成 Micrometer,支持对接 Prometheus、Grafana 等监控平台。
    • 3.x:增强 Actuator 的可观测性,深度集成 Micrometer 2.0,支持更丰富的指标采集(如 JVM、HTTP 请求、数据库连接池);默认暴露 /actuator/health/actuator/info 端点,其他端点需显式开启;支持指标的动态配置和过滤;新增分布式追踪支持,适配微服务监控场景;优化 Actuator 的性能,减少对应用的影响。
  • 其他核心特性差异

    • 1.x:不支持 Spring Native(原生镜像)、函数式 Web 开发、虚拟线程;日志管理依赖 Commons Logging。
    • 2.x:支持 Spring Native 实验性特性(需额外引入 Spring Native 项目);支持函数式 Web 开发(基于 Spring 5.x 的函数式编程特性);支持 Kotlin、Lombok 深度集成;支持 RSocket(2.2+);日志管理逐步转向 SLF4J,减少对 Commons Logging 的依赖。
    • 3.x:官方支持 GraalVM 原生镜像(无需额外插件),通过 native-maven-plugin 直接构建原生可执行文件,实现毫秒级启动;全面支持 Java 9+ 的模块系统(JPMS),允许通过 module-info.java 显式声明模块依赖;默认使用 Java 11+ 的 java.net.http.HttpClient,替代旧版的 Apache HttpClient;移除过时技术(如 Velocity 模板引擎、Guava 缓存自动配置、Commons Logging);3.2+ 版本支持 Java 21 虚拟线程,与嵌入式容器协同,提升高并发吞吐能力;优化 DevTools 热部署功能,支持 LiveReload 和更高效的自动重启。

2.2.3 API 与配置变更(破坏性变更)

三个版本存在较多 API 和配置的破坏性变更,升级版本时需重点关注,避免代码报错:

  • 1.x → 2.x 破坏性变更

    • 配置参数变更:如 server.context-path 改为 server.servlet.context-pathspring.datasource.tomcat.* 改为 spring.datasource.hikari.*(默认数据源切换为 HikariCP);Actuator 配置参数统一前缀为 management
    • API 废弃与替换:如 SpringApplication.run() 方法的参数变更;@EnableAutoConfiguration 的部分属性废弃;Spring Data JPA 的部分 API 调整,Hibernate 升级到 5.2+,移除 Session.get()String重载;Thymeleaf 升级到 3.x,模板语法有变化。
    • 依赖移除:移除对 Spring Boot 1.x 专属 Starter 的支持;移除对 Java 6/7 的支持。
  • 2.x → 3.x 破坏性变更(影响最大)

    • 包名变更:所有 javax.* 包名替换为 jakarta.*,如 javax.servlet.http.HttpServletRequest 改为 jakarta.servlet.http.HttpServletRequestjavax.persistence.Entity 改为 jakarta.persistence.Entity,所有涉及 Java EE 的代码和依赖都需修改。
    • API 废弃与移除:移除 Spring Boot 2.x 中废弃的 API(如 SpringApplicationBuilder 的部分方法);Spring Security 6.x 废弃大量旧 API,如 WebSecurityConfigurerAdapter 被移除,需使用函数式方式配置安全规则;Spring Data JPA 升级到 3.x,部分 API 不兼容。
    • 配置参数变更:移除 @ConfigurationProperties 的宽松绑定,仅支持 kebab-case 格式(如 spring.datasource.url 不可写为 spring.datasource.url 以外的格式);Actuator 部分端点名称和配置参数变更;自动配置类的注册方式变更(从 spring.factories 改为 AutoConfiguration.imports)。
    • 依赖升级:Spring Framework 升级到 6.x,所有依赖 Spring Framework 的组件需同步升级;Hibernate 升级到 6.x,JPA 规范升级到 3.0+;Redis 客户端 Lettuce 升级到 6.x+,Jedis 支持需手动引入依赖;其他第三方依赖(如 MyBatis、Spring Cloud)需升级到支持 Spring Boot 3.x 的版本。

2.2.4 适用场景差异

  • 1.x

    • 适用场景:仅用于存量系统维护,这些系统基于 Java 6/7,无法升级到更高版本的 Java 和 Spring Boot;无需响应式编程、高级监控等特性,业务逻辑简单。
    • 不适用场景:新项目开发、需要高并发、响应式编程、云原生部署的场景;需要使用 Java 8+ 新特性的场景。
  • 2.x

    • 适用场景:存量系统(基于 Java 8),无法升级到 Java 17;需要响应式编程、高级监控、微服务支持,但不需要 GraalVM 原生镜像、Jakarta EE 9+ 等新特性;团队对 Java 17 不熟悉,需要过渡性版本。
    • 不适用场景:新项目开发(推荐 3.x);需要使用 Java 17+ 新特性、GraalVM 原生镜像、Jakarta EE 9+ 规范的场景;对性能要求极高,需要 AOT 编译、虚拟线程等优化的场景。
  • 3.x

    • 适用场景:新项目开发(首选);基于 Java 17+,需要使用 Java 17+ 新特性(如 record、密封类);需要 GraalVM 原生镜像、AOT 编译,追求毫秒级启动和低内存占用(如 Serverless、FaaS 场景);需要 Jakarta EE 9+ 规范支持;微服务架构,需要完善的可观测性、分布式追踪;高并发场景,需要虚拟线程、Undertow 容器等性能优化。
    • 不适用场景:系统基于 Java 8/11,无法升级到 Java 17;依赖大量未适配 Jakarta EE 9+ 的第三方组件;团队对 Java 17、Spring Framework 6.x 不熟悉,且无法投入成本学习。

2.3 版本升级建议

  • 1.x → 2.x:建议直接跳过 1.x,若需升级,先升级到 1.5.x(最后一个 1.x 版本),再逐步升级到 2.7.x(最后一个 2.x 版本),重点修改配置参数、废弃 API,替换数据源为 HikariCP,适配 Spring Framework 5.x 的特性。
  • 2.x → 3.x:升级前需做好充分准备,先升级 Java 版本到 17+;升级所有依赖(如 Spring Framework、Hibernate、MyBatis、Spring Security)到支持 3.x 的版本;修改代码中的 javax.* 包名为 jakarta.*;调整配置参数(如移除宽松绑定、修改 Actuator 配置);重构 Spring Security 配置(替换 WebSecurityConfigurerAdapter);测试所有功能,排查 API 不兼容问题。
  • 新项目:优先选择 3.x 版本,享受 Java 17+ 新特性、GraalVM 原生镜像、AOT 编译等优势,适配云原生和微服务发展趋势;若团队对 Java 17 不熟悉,可先过渡到 2.7.x,待团队熟悉后再升级到 3.x。

三、总结

Spring Boot 的核心价值是「简化开发、提升效率、降低复杂度」,其核心知识点围绕自动配置、起步依赖、嵌入式容器三大核心机制展开,同时涵盖外部化配置、监控运维、测试支持等实战特性,兼顾深度(底层原理、源码级细节)与广度(生态扩展、应用场景)。

Spring Boot 1.x、2.x、3.x 的迭代,本质是「适配 Java 版本升级、完善生态、优化性能、拥抱现代化技术」的过程:1.x 奠定基础,2.x 完善生态和性能,3.x 实现现代化重构,适配 Jakarta EE、GraalVM、Java 17+ 等新技术,满足云原生、微服务、高并发的场景需求。

实际开发中,需根据项目的 Java 版本、业务需求、团队技术栈,选择合适的 Spring Boot 版本,同时掌握核心原理和实战要点,才能高效开发、优化 Spring Boot 应用,充分发挥其核心优势。