是时候为Spring Boot 3.0做准备了

举报
码农小胖哥 发表于 2022/06/03 00:46:42 2022/06/03
【摘要】 2018年2月28日Spring Boot进入2.0时代,距今已经超过4年了。2022 年11月Spring Boot 3.0将正式发布,它将基于Spring Framework 6.0,并且需要 Java 17 或更高版本,同时它也将是Jakarta EE 9的第一个Spring Boot版本。还有六个月的时间留给开发者来过...

40a44d6aad8e85a607f27dbe9125b420.gif

2018年2月28日Spring Boot进入2.0时代,距今已经超过4年了。2022 年11月Spring Boot 3.0将正式发布,它将基于Spring Framework 6.0,并且需要 Java 17 或更高版本,同时它也将是Jakarta EE 9的第一个Spring Boot版本。还有六个月的时间留给开发者来过渡到Spring Boot 3.0,今天胖哥将告诉你一些方法,以便于将来快速迁移到3.0。

Java 17

Java 17将是继Java 8以来最重要的LTS版本,是Java社区八年努力的成果。包含了很多重要的改进,Java 17也是目前性能最强的LTS版本。目前所有的Spring Boot 2.x 版本都能很好地适配Java 17,你可以无需等待,先着手JDK的升级调试,并尝试一些新的特性和API。

尽快升级到Spring Boot 2.7

前几日胖哥已经讲了Spring Boot 2.7基本已经是Spring Boot 2.x最后一个大版本了,Spring Boot 2.5已经停止OSS支持,不再进行维护,Spring Boot 2.6也将在Spring Boot 3.0发布后停止维护,迭代的速度越来越快了。尽早升级到2.7才能更好迁移到3.0,这里胖哥建议不要跳版本升级,比如不要直接从2.4跳到2.7,尽量按照2.4、2.5、2.6、2.7这样的步骤升级,跨度太大反而不利于平滑升级。

移除过时代码

每个Spring Boot版本都会或多或少有一些被标记为@Deprecated的代码,Spring Boot 3.0 将完全移除在 2.x 过时的代码,当然2.x早期的过时代码也可能在最新的2.x被移除。尽量不要使用过时代码,一般过时代码上都注释有过时的原因或者替代的API。

配置文件机制的更改

在Spring Boot 2.4中,配置文件 application.propertiesapplication.yaml 的加载机制被改变,目的是为了简化外部配置的加载方式,使之更加合理,带来的是不向下兼容。为了平滑升级,Spring 提供了一个配置项来兼容旧机制:

spring:
  config:
    use-legacy-processing: true

而这个机制将在3.0时移除,我们必须使用符合新机制的配置方式,如果你存在这几种方式就需要注意了。

多文档Yaml

如果你在yaml配置文件中使用了间隔符---来声明多文档的话,你得知道现在按文档声明的顺序来注册声明的配置属性;而在 Spring Boot 2.3 及更早版本中,基于配置文件激活顺序。举个例子:

---
spring:
  profiles: 
    active: dev
  application:
    name: dev-app
server:
  port: 8081      
---
spring:
  profiles:
    active: prod
  application:
    name: prod-app
server:
  port: 8080

这个配置文件在Spring Boot 2.3以及更早的版本中会根据spring.profiles.active来决定加载的环境。但是从2.4开始后面的属性会覆盖前面的属性。

外部配置总是覆盖jar内的配置

如果你的配置文件在jar之外,并且该配置文件适用于特定的环境,例如application-dev.yaml。2.4以下的版本中,在jar外面的application.yaml不会覆盖jar中的application-<profile名称>.yaml文件,从2.4开始外部文件将总是覆盖jar内的配置文件。你需要检查你是否存在这种情况。

激活配置文件

如果您使用spring.profiles属性来激活环境配置,那么现在就应该迁移到spring.config.activate.on-profile

旧玩法:

spring:
  profiles: "prod"
secret: "production-password"

新玩法:

spring:
  config:
    activate:
      on-profile: "prod"
secret: "production-password"

这真是折腾人啊。spring.profiles.active仍然可以用来激活特定的环境,例如命令行:

$ java -jar myapp.jar --spring.profiles.active=prod

你也可以在 application.propertiesapplication.yaml 中使用spring.profiles.active,从2.4开始spring.profiles.active不能在特定环境中使用,也就是说application-<profile>.yaml中不能使用,---间隔的多文档中也不能使用它。一句话,你不能再通过spring.profiles.active来合并一个包含了spring.config.activate.on-profile属性的配置文件。

同样的机制, spring.profiles.include属性只能在非特定配置文件中使用,下面的配置是无效的:

# 无效配置
spring:
  config:
    activate:
      on-profile: "prod"
  profiles:
    include: "metrics"

更多的要点请参考官方配置文件Spring boot配置迁移指南[1]

性能更高的路径解析方式

从Spring Boot 2.6 开始,路径解析默认使用PathPatternParser,取代了之前的Ant风格匹配AntPathMatcher,升级时很多人的Swagger出问题了,通过spring.mvc.pathmatch.matching-strategy解决了这个问题。虽然在Spring Boot 3.0中AntPathMatcher会继续生效,但是PathPatternParser成为官方推荐,因为它的性能更高,稍后我也将出一篇专题来分析PathPatternParser

兼容问题

首先是Jakarta EE 9的兼容问题,确保你的第三方依赖库和你的代码都兼容Jakarta EE 9。另外也要检查Spring框架正在使用的第三方依赖jar是否有计划兼容Spring 6。

尝试去学习Spring 6

Spring 6以及Spring Boot 3已经发布了多个里程碑,在闲暇时间可以抽出一些时间去尝试一下,体验新的特性和变化,评估你应用升级的难度。

参考资料

[1]

Spring boot配置迁移指南: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide

35cebbf4085668f02536efb294fc5fd0.gif

文章来源: felord.blog.csdn.net,作者:码农小胖哥,版权归原作者所有,如需转载,请联系作者。

原文链接:felord.blog.csdn.net/article/details/125076095

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200