Spring Boot 3.0 正式发布,这份升级指南必须码住
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 以帮助你升级兼容配置属性:
❝
完成迁移之后,务必要移除 spring-boot-properties-migrator 依赖。
Jakarta EE
由于 Java EE 已经变更为 Jakarta EE,包名以 javax 开头的需要相应地变更为 jakarta。这里建议通过 Intellij IDEA 2021.2 提供的内置功能批量处理即可:
❝
当然你也可以手动去变更包名。
升级的关键变更
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 被移除
因为 SnakeYAML 的 JSON 解析与其他解析器的实现不一致。如果你直接使用 YamlJsonParser,请迁移到其他 JsonParser 实现中。
自动配置文件变更
Spring Boot 2.7 引入了一个新的文件:
用于注册自动配置,同时保持与 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 。
评论