文章目录
boot3和boot2有很大不同,必须了解。
例如有个老项目换新,你说这还不简单吗,就是maven换个版本号,10分钟搞定。。。
老项目由boot2升级到boot3
首先,这绝对不是换个版本的问题。
java8 -> jdk17 # 老服务器jdk也需要升级,如果换服务器还涉及到迁移
boot2 -> boot3 #
javax -> jakarta # 重 javax被完全移除
yaml -> 新yaml # 替换废弃配置
Spring Boot 2.x vs Spring Boot 3.x 完整改动清单(面试+升级必备)
这个是标准文档。
一、底层基线(最核心、必改)
1. JDK 强制门槛
- Boot2(2.7):最低 JDK8,兼容 JDK11/17
- Boot3:强制 JDK17+,不再支持 8/11;支持 JDK21 虚拟线程、ZGC 低延迟GC
pom 必须修改:
<java.version>17</java.version>
2. Spring Framework 底层框架
- Boot2 → Spring Framework 5.x
- Boot3 → Spring Framework 6.x
Spring6 移除大量过时API、支持AOT编译、适配Jakarta EE
3. 命名空间大迁移(javax → jakarta,升级最大工作量)
Oracle 移交Java EE给Eclipse,商标限制全量改名,所有EE相关import必须替换
| Boot2 import | Boot3 替换 |
|---|---|
| javax.servlet.* | jakarta.servlet.* |
| javax.persistence.* | jakarta.persistence.* |
| javax.validation.* | jakarta.validation.* |
| javax.websocket | jakarta.websocket |
注意:JDK原生
javax.sql/javax.crypto不变,只改EE规范包。
IDEA:Refactor → Migrate Packages 一键全局替换
4. 嵌入式容器升级
- Boot2:Tomcat9(Servlet4.0)
- Boot3:Tomcat10(Servlet6.0),Jetty11、Undertow2;Tomcat10只认jakarta,旧javax依赖直接报错
二、持久层(JPA/Hibernate)重大改动
- Hibernate 5 → Hibernate 6
- ID生成策略默认变更,旧配置
spring.jpa.hibernate.use-new-id-generator-mappings废弃 - 关联查询别名校验更严格,重复别名直接抛异常
- 方言类包路径调整
- ID生成策略默认变更,旧配置
- JPA API:
javax.persistence全部改为jakarta.persistence - MyBatis/MyBatis-Plus 必须升级适配Jakarta版本
- mybatis-spring-boot-starter ≥3.0
- mybatis-plus-boot-starter ≥3.5.3+
三、Spring Security 6(完全重构配置写法)
Boot2 旧写法(废弃,直接删除)
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {}
}
Boot3 新标准:去掉继承,注册SecurityFilterChain Bean
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
return http.build();
}
其他安全变更:
- CSRF 默认行为调整,
CsrfTokenRequestAttributeHandler修改 - OAuth2升级到OAuth2.1,原生支持PKCE
- 密码加密、Session管理API重构
- 默认安全策略更严格,静态资源默认拦截
四、Web模块(MVC、WebClient、声明式HTTP)
- RestTemplate 不再推荐,主推 WebClient(响应式、非阻塞)
- 新增
@HttpExchange声明式HTTP客户端(替代Feign原生方案) - 全局异常处理
ResponseEntityExceptionHandler方法签名改变 - 请求/响应注解包名变更:
javax.servlet.http→jakarta.servlet.http - WebFlux:Reactor3.4 → Reactor3.5,响应式底层优化
五、云原生新能力(Boot3独有)
1. GraalVM Native Image 原生镜像官方支持
Boot2需要第三方插件折腾;Boot3内置AOT编译、native插件
- 启动从秒级降到毫秒级,内存占用减半
- 适配Serverless、轻量微服务
- 引入starter:
spring-boot-starter-aot
2. 统一可观测性 Observability
Boot2:仅Actuator简单指标
Boot3:Micrometer Tracing + OpenTelemetry 原生集成,链路追踪、日志、指标一体化,开箱即用分布式追踪,无需额外埋点改造
六、配置文件 application.yml/property 变更
- 大量配置项重命名、废弃,官方提供迁移工具:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
启动时控制台打印所有过时配置并给出替换方案。
2. JPA旧属性废弃:
spring.jpa.hibernate.naming.physical-strategy行为微调- 旧Hikari嵌套配置少量重构
- Actuator 变更:
- 默认暴露端点更少,安全收紧
- 指标前缀、监控路径内部实现重构
- 日志:移除老旧
spring-boot-starter-log4j,仅支持Log4j2、SLF4J
七、废弃/移除的功能与依赖
- 完全移除
WebSecurityConfigurerAdapter - 移除JAX-RS旧支持、老旧缓存抽象
- 废弃大量2.x过时API、构造器重载
- Spring Boot 2.7已停止官方维护,3.x长期支持
- 旧版Swagger2(springfox)不兼容jakarta,必须替换为SpringDoc OpenAPI3
八、第三方生态适配要点
- 所有依赖必须升级Jakarta兼容版本:
- Validation:hibernate-validator 6 →7
- 连接池、Redis、MQ客户端同步升级
- 工具类:Shiro、Sa-Token、XXL-JOB等中间件必须升级适配jakarta版本,否则引入javax冲突包启动报错
- Docker镜像基础镜像必须切换JDK17基础镜像
九、极简升级步骤总结(实操顺序)
- JDK升级到17,pom指定java.version=17
- Boot父工程升级到3.x
- IDE一键迁移 javax → jakarta 所有导入
- Security重写配置(删除WebSecurityConfigurerAdapter)
- 升级MyBatis、SpringDoc、Validator等第三方依赖
- 引入配置迁移器,修正yml废弃配置
- 修复Hibernate6 ID生成、SQL别名报错
- 测试Web接口、登录权限、定时任务、监控链路
需要我给你一份Security6完整可运行配置模板,或者一份pom升级最小修改示例吗?

947

被折叠的 条评论
为什么被折叠?



