⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 码农小胖哥 「码农小胖哥」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

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. 1. Java 17
  2. 2. 尽快升级到Spring Boot 2.7
  3. 3. 移除过时代码
  4. 4. 配置文件机制的更改
    1. 4.1. 多文档Yaml
    2. 4.2. 外部配置总是覆盖jar内的配置
    3. 4.3. 激活配置文件
  5. 5. 性能更高的路径解析方式
  6. 6. 兼容问题
  7. 7. 尝试去学习Spring 6