年2月28日SpringBoot进入2.0时代,距今已经超过4年了。年11月SpringBoot3.0将正式发布,它将基于SpringFramework6.0,并且需要Java17或更高版本,同时它也将是JakartaEE9的第一个SpringBoot版本。还有六个月的时间留给开发者来过渡到SpringBoot3.0,今天胖哥将告诉你一些方法,以便于将来快速迁移到3.0。
Java17
Java17将是继Java8以来最重要的LTS版本,是Java社区八年努力的成果。包含了很多重要的改进,Java17也是目前性能最强的LTS版本。目前所有的SpringBoot2.x版本都能很好地适配Java17,你可以无需等待,先着手JDK的升级调试,并尝试一些新的特性和API。
尽快升级到SpringBoot2.7
前几日胖哥已经讲了SpringBoot2.7基本已经是SpringBoot2.x最后一个大版本了,SpringBoot2.5已经停止OSS支持,不再进行维护,SpringBoot2.6也将在SpringBoot3.0发布后停止维护,迭代的速度越来越快了。尽早升级到2.7才能更好迁移到3.0,这里胖哥建议不要跳版本升级,比如不要直接从2.4跳到2.7,尽量按照2.4、2.5、2.6、2.7这样的步骤升级,跨度太大反而不利于平滑升级。
移除过时代码
每个SpringBoot版本都会或多或少有一些被标记为
Deprecated的代码,SpringBoot3.0将完全移除在2.x过时的代码,当然2.x早期的过时代码也可能在最新的2.x被移除。尽量不要使用过时代码,一般过时代码上都注释有过时的原因或者替代的API。配置文件机制的更改
在SpringBoot2.4中,配置文件application.properties和application.yaml的加载机制被改变,目的是为了简化外部配置的加载方式,使之更加合理,带来的是不向下兼容。为了平滑升级,Spring提供了一个配置项来兼容旧机制:
spring:config:use-legacy-processing:true
而这个机制将在3.0时移除,我们必须使用符合新机制的配置方式,如果你存在这几种方式就需要注意了。
多文档Yaml
如果你在yaml配置文件中使用了间隔符---来声明多文档的话,你得知道现在按文档声明的顺序来注册声明的配置属性;而在SpringBoot2.3及更早版本中,基于配置文件激活顺序。举个例子:
---spring:profiles:active:devapplication:name:dev-appserver:port:---spring:profiles:active:prodapplication:name:prod-appserver:port:
这个配置文件在SpringBoot2.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-jarmyapp.jar--spring.profiles.active=prod
你也可以在application.properties或application.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"
更多的要点请参考官方配置文件Springboot配置迁移指南。
性能更高的路径解析方式
从SpringBoot2.6开始,路径解析默认使用PathPatternParser,取代了之前的Ant风格匹配AntPathMatcher,升级时很多人的Swagger出问题了,通过spring.mvc.pathmatch.matching-strategy解决了这个问题。虽然在SpringBoot3.0中AntPathMatcher会继续生效,但是PathPatternParser成为官方推荐,因为它的性能更高,稍后我也将出一篇专题来分析PathPatternParser。
兼容问题
首先是JakartaEE9的兼容问题,确保你的第三方依赖库和你的代码都兼容JakartaEE9。另外也要检查Spring框架正在使用的第三方依赖jar是否有计划兼容Spring6。
尝试去学习Spring6
Spring6以及SpringBoot3已经发布了多个里程碑,在闲暇时间可以抽出一些时间去尝试一下,体验新的特性和变化,评估你应用升级的难度。
来源: