如何升级Spring Boot 2.5.x至4.0.x

先给出升级前后各个核心框架版本对比、以及注意点:

组件 旧版本 新版本 注意点
JDK / 发布时间 1.8 / 14年3月 21 / 23年9月 移除了过时的API
Spring Boot / 发布时间 2.5.14 / 21年5月 4.0.5 / 25年11月 Starter拆分、显式引入
Spring Framework 5.3.20 7.0.6 无缝升级
Spring Security 5.5.3 7.0.4 无缝升级
Jackson 2.12.6 3.1.0 包名、类、语法变化大
Java EE / Jakarta EE javax.* jakarta.* Java EE相关的javax.*API可全局替换
MyBatis Spring Boot Starter 2.3.1 4.0.1 无缝升级
MyBatis(更新缓慢 3.5.13 3.5.19 无缝升级
MySQL Connector/J mysql-connector-java:8.0.29 mysql-connector-j:9.6.0 Maven构件的artifactId重命名
Tomcat 9.0.63 11.0.20 无缝升级

下面,再逐一介绍各个核心框架的升级内容:

JDK

各个LTS版本的主要特性:

版本 特性
1.8 Lambda表达式、函数式编程、Stream API、Optional、新日期时间API、接口默认方法
9 模块化
11 var局部变量类型推断、HTTP Client
17 Switch表达式、文本块、instanceof模式匹配、Record类、Sealed(密封)类
21 虚拟线程

不再100%向下兼容!!!

JDK 9起,已限制使用com.sun.*中的API,可用java.*javax.*等API替换,例如:com.sun.image.codec.jpeg.JPEGCodec可替换为javax.imageio.ImageIO

JDK 17移除了SecurityManager、Applet等。

Spring Boot

与JDK、Spring Framework、Spring Security等版本对应关系:

Spring Boot JDK Spring Framework Spring Security
2.5.x~2.7.x 8~21 5.3 5.5
3.0.x~3.5.x 17~ 6.x、Java EE → Jakarta EE 6.x
4.0.x 17~ 7.x 7.x
容器

Spring Boot 4默认仅支持TomcatJetty,不支持Undertow

spring-boot-starter-web

Spring Boot 4中,被拆分成spring-boot-starter-webmvcspring-boot-starter-web-server-tomcatspring-boot-starter-validation等3个Starter,需要显式引入。

Spring Framework

各个版本的主要特性:

版本 JDK 规范 特性
5.x 8~17 Java EE 7 响应式编程(WebFlux)、Kotlin支持、JUnit 5、WebClient
6.x 17~ Jakarta EE 9/10 Java EE → Jakarta EE、AOT、原生镜像(Native Image)
7.x 17~ Jakarta EE 11 虚拟线程、内置Resilience、声明式HTTP客户端(@HttpExchange)、移除Undertow
Spring Security
Jackson

和2.x相比,Jackson 3.1的包名、类、语法经历了翻天覆地的变化,以POJO对象与字符串的互相转换为例:

2.x版本如下:

...
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

public class JSONUtils {
	private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
	
    public static String stringify(Object object) {
        try {
            return OBJECT_MAPPER.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static <T> T parse(String text, Class<T> clazz) {
        try {
            return OBJECT_MAPPER.readValue(text, clazz);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

3.1版本如下:

...
import tools.jackson.databind.json.JsonMapper;

public class JSONUtils {
    private static final JsonMapper JSON_MAPPER = JsonMapper
            .builder()
            .build();

    public static String stringify(Object object) {
        return JSON_MAPPER.writeValueAsString(object);
    }

    public static <T> T parse(String text, Class<T> clazz) {
        return JSON_MAPPER.readValue(text, clazz);
    }
}

Java EE / Jakarta EE

Java SE仍然保留了部分javax.*API,因此,不能无脑地把javax.*全部替换为jakarta.*!下表给出了Java EE的核心模块与Jakarta EE的对应关系:

模块 javax包 jakarta包
激活 javax.activation-api jakarta.activation-api
Servlet javax.servlet-api jakarta.servlet-api
JSP javax.servlet.jsp-api jakarta.servlet.jsp-api
验证 javax.validation-api jakarta.validation-api
JPA javax.persistence-api jakarta.persistence-api
事务 javax.transaction-api jakarta.transaction-api
注解 javax.annotation-api jakarta.annotation-api
邮件 javax.mail jakarta.mail-api
WebSocket javax.websocket-api jakarta.websocket-api
JMS javax.jms-api jakarta.jms-api

MyBatis

MyBatis 3.5.19是最后一个支持JDK 8的版本,后续的3.6.0+(尚未正式发布)仅支持JDK 11+。

MySQL Connector/J

在版本8.0.31之后,Maven构件的artifactId,从mysql-connector-java改成了mysql-connector-j

Tomcat

各个版本的主要特性:

版本 JDK最低 规范 特性
7 6 Servlet 3.0、JSP 2.2  
8 7 Servlet 3.1、JSP 2.3 HTTP/2
9 8 Servlet 4.0、JSP 2.3 TLS 1.3
10.0 8 Servlet 5.0、JSP 3.0 Java EE → Jakarta EE、Jakarta EE 9
10.1 11 Servlet 6.0、JSP 3.1 Jakarta EE 10
11 17 Servlet 6.1、JSP 4.0 Jakarta EE 11、HTTP/3、虚拟线程
写于 2026年04月21日