Spring Boot 3.0 正式发布,这份升级指南必须收藏

2023-05-16

0b12674339a4975a9a5b7b03840cb495.gif

Spring Boot 3.0 现已正式发布,它包含了 12 个月以来 151 个开发者的 5700 多次代码提交。这是自 4.5 年前发布 2.0 以来,Spring Boot 的第一次重大修订。

它也是第一个支持 Spring Framework 6.0 和 GraalVM 的 Spring Boot GA 版本,同时也是第一个基于Java 17的Spring Boot版本,以Jakarta EE 9为基准并支持Jakarta EE 10。同时借助于GraalVM支持了AOT和Native Image。

3.0升级指南

如果你想尝试Spring Boot 3.0,不妨参考胖哥精心准备的升级指南。

升级JDK

首先要升级你的JDK到JDK17,如果你要使用Native Image特性,要使用GraalVM 22.3以上和 Native Build Tools Plugin 0.9.17 或更高的版本。

平滑升级

这里不建议直接从低于Spring Boot 2.7的版本直接升级到Spring Boot 3.0。不然新特性和API变更太多,就需要你修改大量的配置,升级路径会过于陡峭。建议通过小版本号分阶段升级到2.4、2.6、2.7,最后再到3.0。

依赖评估

Spring Boot3.0下依赖组件的版本要求也不尽相同,比如Spring Boot Kafka Starter可能对Kafka有什么要求,这要求你进行充分评估。Spring Cloud体系应该在对应的Spring Boot 3.0体系发布后进行升级。

升级到Spring Boot 3

一旦上面的工作准备完毕,你就可以开始尝试升级到Spring Boot 3.0了。

配置属性兼容

在Spring Boot 3.0中,一些配置属性被重新命名/删除了,开发人员需要相应地更新他们的application.properties或者application.yml。为了帮助你做到这一点,Spring Boot 3.0提供了一个spring-boot-properties-migrator模块。一旦作为依赖关系添加到你的项目中,它不仅会在启动时分析你的应用程序的环境并打印诊断结果,而且还会在运行时为你临时迁移属性。把下面这个加入pom.xml以帮助你升级兼容配置属性:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-properties-migrator</artifactId>
 <scope>runtime</scope>
</dependency>

完成迁移之后,务必要移除spring-boot-properties-migrator依赖。

Jakarta EE

由于Java EE已经变更为Jakarta EE,包名以 javax开头的需要相应地变更为jakarta。这里建议通过Intellij IDEA 2021.2提供的内置功能批量处理即可:

6e69956b36ac420bf2fe66e463e99cd7.gif


当然你也可以手动去变更包名。

升级的关键变更

Spring Boot 3.0有一些关键改变,这些改变将与大多数应用程序有关。所以开发者要仔细阅读这些变更。

图片Banner不再支持

现在Spring Boot 3.0自定义Banner只支持文本类型(banner.txt),不再支持图片类型。

日志日期格式变更

Logback和Log4j2的日志消息的日期和时间部分的默认格式已经改变,以符合ISO-8601标准。新的默认格式yyyy-MM-dd'T'HH:mm:ss.SSSXXX使用T来分隔日期和时间,而不是空格字符,并在最后添加时区偏移。LOG_DATEFORMAT_PATTERN环境变量或logging.pattern.dateformat属性可以用来恢复以前的默认值yyyy-MM-dd HH:mm:ss.SSS

ConstructingBinding注解

配置属性类注解@ConfigurationProperties默认情况下不再需要使用@ConstructorBinding来标记构造,你应该从配置类上移除它,除非该配置类多个构造函数来明确配置属性绑定。

YamlJsonParser被移除

因为SnakeYAMLJSON解析与其他解析器的实现不一致。如果你直接使用YamlJsonParser,请迁移到其他JsonParser实现中。

自动配置文件变更

Spring Boot 2.7引入了一个新的文件:

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

用于注册自动配置,同时保持与 spring.factories 中注册的向后兼容。Spring Boot 3.0发布后,spring.factories已经被移除,只能通过imports文件来注册自动配置。

Web应用变更
路径匹配

现在Spring MVC和Spring Webflux 的路径匹配规则已经做了调整,默认情况下尾部斜杠/的匹配机制将和以前不同:

  • 3.0以前/foo/bar等同于/foo/bar/

  • 3.0以后/foo/bar不同/foo/bar/

弃用配置 server.max-http-header-size

server.max-http-header-size已经被弃用,现在用server.max-http-request-header-size替代 ,并且现在该属性只能来配置请求头的大小,不再限制某些Web容器的响应头大小,如果需要限制响应头大小请通过自定义WebServerFactoryCustomizer来实现。

优雅停机阶段变更

优雅停机由SmartLifecycle实现,在SmartLifecycle.DEFAULT_PHASE - 2048阶段开始,Web服务器在SmartLifecycle.DEFAULT_PHASE - 1024阶段停止。任何参与优雅关机的SmartLifecycle实现都应该被相应地更新。

Jetty

由于Jetty目前还不支持Servlet 6.0,使用Jetty的开发者需要通过降低Jakarta Servlet的版本为5.0。

数据访问相关的变更

spring.data前缀已被保留给Spring Data项目,如果你使用了Spring Data项目的子项目,application.yaml中相关的配置属性就需要响应的变更。例如 spring.redis现在需要修改为spring.data.redis

数据访问相关的组件现在都使用了比较新的版本:

  • Flyway更新到 9.0

  • Hibernate 更新到 6.1

  • R2DBC 更新到 1.0

Mongodb

另外 Flapdoodle 嵌入式 MongoDB 的自动配置被移除,开发者有需要的话需要自行引入。

Elasticsearch

Elasticsearch的Rest客户端采用了新的API实现,旧的自动配置和Spring Data Elasticsearch中旧的客户端API已经被移除。

Spring Security

相关的变更,胖哥稍后会整理并独立分享。

其它变更

可观测性、度量跟踪、Maven、Gradle也都有不同程度的变更,有需要可以查看官方的Spring-Boot-3.0-Migration-Guide 。

记得收藏这一篇,后续胖哥会深入Spring 6.0和Spring Boot 3.0的细节部分。

b5812789ab54b2f31dc41b66e96ff39d.gif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 3.0 正式发布,这份升级指南必须收藏 的相关文章

  • Web 服务与 Spring 远程处理

    我完全不明白通过 spring 或 axis 实现的常规 Web 服务与远程处理之间的区别 如果我的问题根本不相关 我只是对 Spring Web 服务与 Spring 远程处理感到困惑 何时使用远程处理以及何时使用 Web 服务 感谢您的
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Spring 应用程序启动前的 Spring Boot 设置日志记录

    我有一个项目 在启动 SpringApplication 之前需要日志记录机制 我怎样才能做到这一点 我尝试设置自己的日志记录机制 LogManager getLogManager readConfiguration 但在 Spring 应
  • Spring WebFlux:在 Spring Data MongoDB 反应存储库中的 null 值时发出异常?

    我正在尝试学习如何使用 MongoDB 反应存储库spring boot 2 0 0 M2 但我担心我没有按预期做事 这是我的方法之一 试图找到一个User通过他们的电子邮件 但如果没有 该方法应该抛出异常 Override public
  • 基本 NASM 引导程序

    我最近一直在研究操作系统 启动过程和 NASM 在我的旅程中 我遇到了一段有用的引导代码 我部分理解并通过虚拟软盘对其进行了测试 我的基本问题是我不明白其中一些行的作用 我已经评论了我认为这些线条的作用 任何更正或确认将不胜感激 This
  • 如何从单独的 Jars 加载 @Configuration 类

    我有一个 SpringBoot 主应用程序 以及一个单独的 Maven 模块项目 该项目编译为单独的 Jar 该模块有一个 Spring 配置类 注释为 Configuration 我想在主应用程序加载时加载它 显然 这并不是开箱即用的 只
  • Spring Security 通过并发登录尝试将用户锁定

    我是安全新手 遇到了一个问题 该问题导致用户帐户被锁定 只有重新启动应用程序才能修复它 我有一个带有 spring security 4 0 2 RELEASE 应用程序的 spring boot 1 3 0 BUILD SNAPSHOT
  • 如何让Spring RabbitMQ创建一个新的队列?

    根据我对rabbit mq的 有限 经验 如果您为尚不存在的队列创建新的侦听器 则会自动创建该队列 我正在尝试将 Spring AMQP 项目与rabbit mq 一起使用来设置侦听器 但出现错误 这是我的 xml 配置
  • 使用 Spring AOP 记录方法条目[重复]

    这个问题在这里已经有答案了 任何人都知道如何在跟踪级别使用 Spring AOP 和 log4j 记录方法条目 包括参数值 并退出 它应该能够记录多个包中的类 您可以使用 大约 用于此类目的的方面 Component Aspect Orde
  • Redis 会话序列化器 3.2 和 4.2 之间不匹配

    我有一个基于 Spring Cloud 的应用程序在多个 spring boot 服务器上运行 所有服务器使用 EnableRedisHttpSession共享相同的Spring Session 我现在想将第三方小部件集成到我的应用程序中
  • Spring Neo4j不保存数据

    我创建了新的应用程序 它应该通过存储库将 Person 对象保存到 neo4j 中 但是当我使用 findAll 方法时 我没有任何项目 我正在使用 Spring Boot 这是我的配置 package com example import
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • Spring Rest-API - 403 禁止错误响应

    我是 Spring 新手 我正在编写 REST API 我收到 403 删除 放置禁止错误 以下是我正在处理的示例 RequestMapping value noteId method RequestMethod PUT public Re
  • Spring Rest POST Json RequestBody 不支持内容类型

    当我尝试使用 post 方法发布新对象时 RequestBody 无法识别 contentType Spring 已经配置完毕 POST 可以与其他对象一起使用 但不能与这个特定对象一起使用 org springframework web
  • 如何在JUnit测试中将MockWebServer端口设置为WebClient?

    我在用着spring boot with WebClient 它被自动装配为一个 bean 问题 写一个junit集成测试 我必须使用okhttpMockWebServer 该模拟始终在随机端口上启动 例如localhost 14321 N
  • Spring中是否可以禁用自动验证

    我有一个 Spring 启动应用程序 我的请求类传递给我的 RestController包含javax validation我无法更改 删除的注释 它们作为第三方库提供 所以我想手动验证我的请求对象或者根本不验证它们 不幸的是 如果我添加
  • Spring MultipartFile 验证和转换

    我目前有一个 Spring MVC 控制器 它采用 MultipartFile RequestMapping method RequestMethod POST public String doUpload RequestParam fil

随机推荐

  • 有没有完全自主的国产化数据库技术

    前段时间的俄乌冲突 xff0c Oracle 宣布 暂停在俄罗斯的所有业务 xff0c 相信大家的心情绝不是隔岸观火 xff0c 而是细思恐极 数据库号称 IT 领域三大核心之一 xff08 其他两个是 CPU 和操作系统 xff09 xf
  • 多个线程之间如何协同

    1 CountDownLatch 计数器 在多线程协作完成任务的时候 xff0c 有时候需要等待其他线程完成任务后 xff0c 主线程才能继续执行 xff0c 我们可以使用 Thread 类的 join 方法 xff0c 让主线程等待被 j
  • 利用Sharding-JDBC 实现Mysql读写分离

    为什么要读写分离 xff1f 读写分离则是将事务性的增 改 删操作在主库执行 xff0c 查询操作在从库执行 一般业务的写操作都是比较耗时 xff0c 为了避免写操作影响查询的效率 xff0c 可以使用读写分离 当然读写分离并不是万能的 x
  • 并发编程的核心问题

    并发编程并不是一项孤立存在的技术 xff0c 也不是脱离现实生活场景而提出的一项技术 相反 xff0c 并发编程是一项综合性的技术 xff0c 同时 xff0c 它与现实生活中 的场景有着紧密的联系 并发编程有三大核心问题 xff1a 分工
  • windows xp管理工具不见了怎么办

    管理工具其实是一个文件夹C ProgramData Microsoft Windows Start Menu Programs Administrative Tools 管理工具里的内容就是这个文件夹里的内容 xff0c 你的内容不见了 x
  • 分享搭建脚手架的一些经验

    印象中有些日子没有写文章了 xff0c 最近一直在放飞自我 xff0c 今天和大家分享的一些在搭建脚手架和编程中的一些实践原则 所有目标都是 清晰架构分层 使用统一的依赖管理 这种方式是基于我多年来的实践 最开始我也将项目类库及其版本随意的
  • POJO、Java Bean是如何定义的

    之前介绍过DTO PO VO的转换 xff0c 在日常开发中还有一些类经常被人叫做POJO xff0c 还有的人叫它们Java Bean 这些概念都是在特定场景下引入 xff0c 用来表明它们的特性的 那这些称呼都是啥意思 xff0c 有啥
  • Maven依赖的作用域你到底用对了没有

    Maven是目前Java开发主要使用的依赖管理构建工具之一 xff0c 但是很多人在引用依赖的时候直接引用坐标 xff0c 而没有考虑依赖的作用范围 xff0c 结果导致出现这样和那样的问题 今天胖哥就来说明一下Maven引用依赖的一个要点
  • 胖哥亲自带你玩转Spring Security OAuth2

    参与Spring Security与OAuth2专栏限定免费学习群 xff0c 请从活动主页扫描第三个专栏学习群二维码入群 xff01 关于21天学习挑战赛活动细节 xff0c 请从点击活动主页了解 作者介绍 码农小胖哥 xff0c Spr
  • 21天,胖哥亲自带你玩转OAuth2

    参与Spring Security与OAuth2专栏限定免费学习群 xff0c 请从阅读原文扫描第三个专栏学习群二维码入群 xff01 关于21天学习挑战赛活动细节 xff0c 请点击 阅读原文了解 作者介绍 码农小胖哥 xff0c Spr
  • StoneDB 为何敢称业界唯一开源的 MySQL 原生 HTAP 数据库?

    近些年 xff0c HTAP 正在受到人们越来越多的关注 xff0c Gartner 在 2014 年提出了 HTAP 这个术语和它的定义 xff1a Hybrid transaction analytical processing HTA
  • 聊聊数据库建表的15个小技巧

    前言 对于后端开发同学来说 xff0c 访问数据库 xff0c 是代码中必不可少的一个环节 系统中收集到用户的核心数据 xff0c 为了安全性 xff0c 我们一般会存储到数据库 xff0c 比如 xff1a mysql xff0c ora
  • 【收藏备用】15大超全应用场景总结,进阶主机安全

    随着业务数字化转型 xff0c 企业的业务变得越来越开放和灵活 xff0c 面临的安全挑战也日益增加 在这种多变 开放的场景下 xff0c 无论安全边界怎么做 xff0c 都无法阻挡黑客打破边界进入企业内部来窃取核心资产 当下安全对抗以及安
  • Java 19 正式发布,改善多线程、并发编程难度

    Java 19 在数分钟前正式发布 xff0c 这是一个非 LTS xff08 长期支持 xff09 版本 该版本的七项功能包括结构化并发 记录模式 外部函数和内存 API 的预览 xff0c 以及对开源 Linux RISC V 指令集架
  • 文末下载方式 | Jetbrains的下一代IDE工具Fleet公测

    之前胖哥介绍了Jetbrains的下一代IDE工具Fleet xff0c 激起了很多同学的兴趣 如果你还不知道Fleet是什么就去看下这一篇文章 Fleet是Jetbrains新出品的一款分布式多语言编辑器和 IDE 它是 IntelliJ
  • Chrome浏览器官方离线安装包下载地址

    1 下列地址任选其一 http viewver coolpage biz chrome php http viewversion coolpage biz chrome php http user336598776 hstn me chro
  • idea如何设置背景图

    写在前面 作为一个Java开发者 xff0c 我想大家肯定都知道IDEA这个编译器吧 xff0c 但是idea默认的背景并不是很美观 xff08 应该说很丑 xff0c 个人感觉哈 xff09 那么如何更换背景呢 xff08 此方法同样适用
  • Spring 6.0已发布,AOT和Native Image成为新亮点

    最新的6 0文档已经更新 Spring Framework 6 0 上周末已经正式发布 接下来Spring的一系列项目都会以6 0为基准发布新版本 xff0c 至此Spring家族正式进入6 0时代 Spring 6 0的基准线为Java
  • 一周发布30多个版本,Spring 6.0开始爆发

    从Spring Framework 6 0正式发布开始 xff0c Spring团队开启了 爆兵模式 xff0c 近一周发布了30多个版本 近期Spring发布计划 基本上每个组件都多版本同时发布 xff0c 18日Spring Data系
  • Spring Boot 3.0 正式发布,这份升级指南必须收藏

    Spring Boot 3 0 现已正式发布 xff0c 它包含了 12 个月以来 151 个开发者的 5700 多次代码提交 这是自 4 5 年前发布 2 0 以来 xff0c Spring Boot 的第一次重大修订 它也是第一个支持