0x02. Spring Boot 3 之SpringBoot 版本升级最佳实践指南

news2024/9/23 3:18:25

Spring Boot 3 之SpringBoot低版本升级最佳实践

  • 0x01 前言
  • 0x02 升级Spring Boot
    • 2.1 从Spring Boot 1.5.x 升级到Spring Boot 2.x
      • 2.1.1 依赖检查
      • 2.1.2 检查自定义配置
      • 2.1.3 检查系统需要
      • 2.1.4 升级到Spring Boot 2.x
      • 2.1.5 配置属性迁移
    • 2.2 从Spring Boot 2.7.x 升级到Spring Boot 3.0.x
      • 2.2.1 依赖检查
      • 2.2.2 Spring Security 重大升级
      • 2.2.3 检查系统需要
      • 2.2.4 查看 Spring Boot 2.x 的弃用
      • 2.2.5 配置属性迁移
      • 2.2.6 升级到 Spring Framework 6.x
      • 2.2.7 核心改变
        • 2.2.7.1 图片Banner不再支持
        • 2.2.7.2 日期格式输出
        • 2.2.7.3 类级别不再需要@ConstructingBinding
        • 2.2.7.4 YamlJsonParser 已经被移除
        • 2.2.7.5 自动配置文件
      • 2.2.8 web 应用程序变化
        • 2.2.8.1 Spring MVC 和WebFlux URL匹配变化
        • 2.2.8.2 server.max-http-header-size
        • 2.2.8.3 Jetty
        • 2.2.8.4 Actuator 健康检查变化
        • 2.2.8.5 数据访问层变化
        • 2.2.8.6 其他移除

0x01 前言

这篇博文来分享下Spring Boot 低版本升级到Spring Boot 3 的最佳实践。

0x02 升级Spring Boot

2.1 从Spring Boot 1.5.x 升级到Spring Boot 2.x

如果你是从Spring Boot 1.x 版本升级到SpringBoot 2.x,那么需要先升级到1.5.x 版本确定没问题后再开始操作。

  • 参见原文:Spring Boot 1.5.x 迁移到Spring Boot 2.x迁移指南

2.1.1 依赖检查

我们需要自己查看和评估 Spring Boot 1.5.x 的依赖和Spring Boot 2.0.x 版本的依赖变化对自身项目的影响。

  • Spring Boot 1.5.x 对其他第三方开源库的依赖兼容关系
  • Spring Boot 2.0.x 对其他第三方开源库的依赖兼容关系
    在这里插入图片描述
  • Spring Boot 2.1.x 对其他第三方开源库的依赖兼容关系
  • Spring Boot 2.2.x 对其他第三方开源库的依赖兼容关系
  • Spring Boot 2.3.x 对其他第三方开源库的依赖兼容关系
  • Spring Boot 2.4.x 对其他第三方开源库的依赖兼容关系
  • Spring Boot 2.5.x 对其他第三方开源库的依赖兼容关系
  • Spring Boot 2.6.x 对其他第三方开源库的依赖兼容关系
  • Spring Boot 2.7.x 对其他第三方开源库的依赖兼容关系

2.1.2 检查自定义配置

如果项目中有一些自定义的Java Config 类配置,而不是依赖自动配置机制,那么则需要关注下升级后自定义配置类是否兼容。

2.1.3 检查系统需要

  • Spring Boot 1.5.x 之前支持JDK 6 和JDK 7
  • Spring Boot 2.0.x 需要Java 8 或更高版本以及Spring Framework 5, 并且 JDK 6 和JDK7 不再支持。

2.1.4 升级到Spring Boot 2.x

  • 不建议升级到Spring Boot 2.0.0.RELEASE ,因为这个版本发现了很多问题,更新的版本已经修复了。
  • 另外,建议分阶段升级,而不是一次性升级到最新的GA 正式发布版本
    • 比如先升级到2.0.x ,然后再升级到2.1.x ,依此类推。

2.1.5 配置属性迁移

  • 在 Spring Boot 2.0 中,许多配置属性被重命名/删除,开发人员需要相应地更新他们的 application.properties/application.yml

  • 为了帮助您解决这个问题,Spring Boot 提供了一个新的 spring-boot-properties-migrator 模块。 一旦添加为项目的依赖项,这不仅会在启动时分析应用程序的环境并打印诊断信息,还会在运行时为您临时迁移属性。 这是您的应用程序迁移过程中必须具备的:

Maven版本

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

Gradle版本

runtime("org.springframework.boot:spring-boot-properties-migrator")

切记:完成迁移后,请确保从项目的依赖项中删除这个依赖。

2.2 从Spring Boot 2.7.x 升级到Spring Boot 3.0.x

如果想将自己项目的Spirng Boot 2.x 升级到SpringBoot 3.x,那么建议先升级到2.7.x 版本确定没问题后再继续操作。

  • 参见原文: Spring Boot 2.7.x 迁移到Spring Boot 3.x 迁移指南

2.2.1 依赖检查

我们需要自己查看和评估 Spring Boot 2.7.x 的依赖和Spring Boot 3.0.x 版本的依赖变化对自身项目的影响。

  • Spring Boot 2.7.x 对其他第三方开源库的依赖兼容关系
  • Spring Boot 3.0.x 对其他第三方开源库的依赖兼容关系
    在这里插入图片描述
  • Spring Boot 当前最新版本 对其他第三方开源库的依赖兼容关系

2.2.2 Spring Security 重大升级

  • Spring Boot 3.0 使用了 Spring Security 6.0。
  • Spring Security 团队发布了 Spring Security 5.8 以简化向 Spring Security 6.0 的升级。
  • 在升级到 Spring Boot 3.0 之前,请考虑将您的 Spring Boot 2.7 应用程序升级到 Spring Security 5.8。
  • Spring Security 团队已经制作了一份迁移指南,可以帮助我们这样做。

https://docs.spring.io/spring-security/reference/5.8/migration/index.html

2.2.3 检查系统需要

Spring Boot 3.0.x 需要Java 17 或更高版本以及Spring Framework 6,JDK8 不再支持。

2.2.4 查看 Spring Boot 2.x 的弃用

Spring Boot 2.x 中弃用的类、方法和属性已在此版本中删除。 请确保在升级之前没有调用已弃用的方法。

2.2.5 配置属性迁移

在 Spring Boot 3.0 中,一些配置属性被重命名/删除,开发人员需要相应地更新他们的 application.properties/application.yml。

为了帮助我们,Spring Boot 提供了一个 spring-boot-properties-migrator 模块。

一旦添加为项目的依赖项,这不仅会在启动时分析应用程序的环境并打印诊断信息,还会在运行时为您临时迁移属性。

  • Maven版本
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-properties-migrator</artifactId>
	<scope>runtime</scope>
</dependency>
  • Gradle版本
runtime("org.springframework.boot:spring-boot-properties-migrator")

切记:完成迁移后,请确保从项目的依赖项中删除这个依赖。

2.2.6 升级到 Spring Framework 6.x

Spring 版本升级到 Spring Framework 6.x

Spring Boot 3.x 依赖 Jakarta EE 规范

Spring Boot 3.0 已升级到 Jakarta EE 10 中包含的版本。

例如,Spring Boot 3.0 使用 Servlet 6.0 和 JPA 3.1 规范。

如果您正在管理自己的依赖项,而不依赖于我们的入门 POM,则应确保已适当更新 Maven 或 Gradle 文件。 您需要特别注意旧的 Java EE 依赖项不再直接或可传递地用于您的构建中。 例如,如果您应该始终使用

jakarta.servlet:jakarta.servlet-api

而不是

javax.servlet:javax.servlet-api

2.2.7 核心改变

Spring Boot 3.x 中Spring Boot 核心的一些东西也发生了很大变化。

2.2.7.1 图片Banner不再支持

  • Spring Boot 启动时候 Banner ,已不再支持图片这种类型。
    在这里插入图片描述

banner.gif、banner.jpg 和 banner.png 文件现在将被忽略,应替换为基于文本的 banner.txt 文件。

2.2.7.2 日期格式输出

  • LogbackLog4j2 日志消息的日期和时间组件的默认格式已更改以符合 ISO-8601 标准。

  • 新的默认格式 yyyy-MM-dd'T'HH:mm:ss.SSSXXX 使用 T 代替空格字符分隔日期和时间,并在末尾添加时区偏移量。

  • LOG_DATEFORMAT_PATTERN 环境变量或 logging.pattern.dateformat 属性可用于恢复以前的默认值 yyyy-MM-dd HH:mm:ss.SSS

2.2.7.3 类级别不再需要@ConstructingBinding

@ConfigurationProperties 类的类型级别不再需要@ConstructorBinding,应该将其删除。

当一个类或记录有多个构造函数时,它仍然可以用在构造函数上以指示应该使用哪个构造函数进行属性绑定。

2.2.7.4 YamlJsonParser 已经被移除

YamlJsonParser 已被删除,因为 SnakeYAML 的 JSON 解析与其他解析器实现不一致。

如果我们直接使用的 YamlJsonParser,请迁移到其他 JsonParser 实现之一

2.2.7.5 自动配置文件

Spring Boot 2.7 介绍了一个新的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 用于注册自动配置,同时保持与 spring.factories 中注册的向后兼容性。

在Spring Boot 3.x 版本中,已删除对在 spring.factories 中注册自动配置的支持,以支持导入文件。

2.2.8 web 应用程序变化

如果我们升级的是一个web应用,那么需要好好看看这些改变。

2.2.8.1 Spring MVC 和WebFlux URL匹配变化

从 Spring Framework 6.0 开始,尾部斜杠匹配配置选项已被弃用,其默认值设置为 false。

这意味着以前,以下控制器将同时匹配“GET /some/greeting”和“GET /some/greeting/”:

@RestController
public class MyController {

  @GetMapping("/some/greeting")
  public String greeting {
    return "Hello";
  }

}

在这个改变中,GET /some/greeting/ 将会匹配失败返回404错误

开发人员应该改为通过代理、Servlet/web 过滤器配置显式重定向/重写,甚至在控制器处理程序上显式声明附加路由(如 @GetMapping("/some/greeting", "/some/greeting/") 更有针对性的案例。

在我们的应用程序完全适应这种变化之前,您可以使用以下全局配置更改默认值:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
      configurer.setUseTrailingSlashMatch(true);
    }

}

2.2.8.2 server.max-http-header-size

以前,server.max-http-header-size 在四个受支持的嵌入式 Web 服务器中的处理方式不一致。

  • 使用 Jetty、Netty 或 Undertow 时,它将配置最大 HTTP 请求标头大小。

  • 使用 Tomcat 时,它会配置最大 HTTP 请求和响应标头大小。

为了解决这种不一致,已弃用 server.max-http-header-size 并引入了替代品 server.max-http-request-header-size

这两个属性现在仅适用于请求标头大小,与底层 Web 服务器无关。

要限制 Tomcat 或 Jetty(仅有的两个支持此类设置的服务器)上 HTTP 响应的最大标头大小,请使用 WebServerFactoryCustomizer

2.2.8.3 Jetty

Jetty 不再支持Servlet 6.

要在Spring Boot 3.x 中使用Jetty,需要下载servlet API 更新到5.0

我们也可以使用jakarta-servlet.version

2.2.8.4 Actuator 健康检查变化

如果项目中用了actuator 依赖,则需要关注如下变化。

  • JMX Endpoint Exposure
  • 默认情况下,现在只有健康端点通过 JMX 公开,以与默认的 Web 端点公开保持一致。
  • 这可以通过配置 management.endpoints.jmx.exposure.includemanagement.endpoints.jmx.exposure.exclude 属性来改变。
  • httptrace端点重命名为 httpexchanges
  • httptrace 端点和相关基础设施记录并提供对最近 HTTP 请求-响应交换信息的访问。
  • 在引入对 Micrometer Tracing 的支持后,名称 httptrace 可能会引起混淆。
  • 为了减少这种可能的混淆,端点已重命名为 httpexchanges
  • 端点响应的内容也受到此重命名的影响。
  • 相关的基础设施类也已重命名。 例如,HttpTraceRepository 现在被命名为 HttpExchangeRepository 并且可以在 org.springframework.boot.actuate.web.exchanges 包中找到
  • Actuator JSON
  • Spring Boot 附带的执行器端点的响应现在使用隔离的 ObjectMapper 实例来确保结果一致。
  • 如果您想恢复到旧行为并使用应用程序 ObjectMapper,您可以将 management.endpoints.jackson.isolated-object-mapper 设置为 false
  • 如果您开发了自己的端点,您可能希望确保响应实现 OperationResponseBody 接口。
  • 这将确保在将响应序列化为 JSON 时考虑隔离的 ObjectMapper
  • Acutator 端点敏感值
  • 由于 /env 和 /configprops 端点可以包含敏感值,因此默认情况下始终屏蔽所有值。

  • 这曾经只适用于被认为是敏感的密钥。

  • 相反,此版本选择了更安全的默认设置。

    • 基于键的方法已被删除,取而代之的是基于角色的方法,类似于健康端点详细信息。
    • 是否显示未过滤的值可以使用属性 management.endpoint.env.show-valuesmanagement.endpoint.configprops.show-values 进行配置,它们可以具有以下值:
      • NEVER - 所有值都经过清理(默认值)。
      • ALWAYS - 所有值都出现在输出中(将应用清理功能)。
      • WHEN_AUTHORIZED - 仅当用户获得授权时,值才会出现在输出中(将应用清理功能)。
  • 对于 JMX,用户始终被视为已授权。 对于 HTTP,如果用户通过身份验证并具有指定的角色,则认为他们已获得授权。

  • QuartzEndpoint 的清理也可以使用属性 management.endpoint.quartz.show-values 以相同的方式配置。

2.2.8.5 数据访问层变化

  • Hibernate 6.1 变化
  • Spring Boot 3.0 默认使用 Hibernate 6.1。
  • 请参阅 Hibernate 6.0 和 6.1 迁移指南以了解这对您的应用程序有何影响。
  • 依赖管理和 spring-boot-starter-data-jpa starter 已更新为使用新的 org.hibernate.orm 组 ID 作为其 Hibernate 依赖项。
  • spring.jpa.hibernate.use-new-id-generator-mappings 配置属性已被删除,因为 Hibernate 不再支持切换回旧的 ID 生成器映射。

2.2.8.6 其他移除

Spring Boot 3.0 中删除了对以下依赖项的支持:

  • Apache ActiveMQ
  • Atomikos
  • EhCache 2
  • Hazelcast 3

已删除对 Apache Solr 的支持,因为其基于 Jetty 的客户端 Http2SolrClientJetty 11 不兼容。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

概率统计·样本及抽样分布【随机样本、抽样分布】

总体与个体 总体&#xff1a;试验的全部可能的观察值称为总体 个体&#xff1a;总体中每个可能的观察值称为个体 总体期望样本平均期望 总体方差/n样本平均方差 随机样本 X1&#xff0c;X2……Xn相互独立&#xff08;x1&#xff0c;x2……xn是观察值&#xff09;&#xff0…

[附源码]计算机毕业设计springboot疫苗及注射管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

STC 51单片机52——自发自收串行通信

#include <reg52.h> unsigned char ch0; /* 初始化函数 */ void uart_init() { TMOD0x20; //T1为方式2 TL10xfd; TH10xfd; //波特率为9600的计数初值 SCON0x50; //串口工作在方式1。允许接收 …

[附源码]Python计算机毕业设计Django基于Java的日用品在线电商平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

五问补盲(一) | 激光雷达补盲,视场多大算大?

作者 | 爱LiDAR的小飞哥 编辑 | 王博“大&#xff01;超大&#xff01;更大&#xff01;” 最近&#xff0c;补盲激光雷达市场热闹非凡&#xff0c;各家在宣传产品的视场角时竭尽全力&#xff0c;毫不吝啬形容词。 回归到实际需求&#xff0c;多大的视场角够用&#xff1f;超大…

西门子触摸屏上电显示初始画面几秒后,自动切换到下一个画面的具体方法

西门子触摸屏上电显示初始画面几秒后,自动切换到下一个画面的具体方法 例如:在启动画面停留10秒后,切换到其他画面。 具体实现方法可参考以下内容: 如下图所示,新建一个项目,在画面中添加2个画面, 如下图所示,在变量中添加一个内部变量tag1,用于控制画面的切换, …

es查询响应结果中获取某些字段的值

有时候使用es查询出的结果包含多个字段&#xff0c;如果数据中仅仅包含几个字段时&#xff0c;我们是很容易挑出自己需要的字段值&#xff0c;但是如果数据中包含几十或者几百甚至更多时&#xff0c;尤其是数据中嵌套好多层时&#xff0c;不容易直接挑取出需要的值&#xff0c;…

【人工智能/算法】搜索求解(Solving Problems by Searching)

文章目录一、求解与搜索二、盲目式搜索1. 深度优先搜索&#xff08;Depth First Search, DFS&#xff09;回溯搜索&#xff08;Backtracking Search&#xff09;2. 广度优先搜索&#xff08;Breadth First Search, BFS&#xff09;一致代价搜索&#xff08;Uniform-cost Search…

你们看过《点燃我,温暖你》没有呀,里面比较火的那个爱心代码,今天小编用Python实现啦,这就是程序员的烂漫吗

前言 包子们&#xff0c;上午好 最近有个剧挺火的 就是那个程序员的剧&#xff0c;叫《点燃我&#xff0c;温暖你》 最近听说很火呀&#xff0c;那作为程序员&#xff0c;Python中的战斗机的小编&#xff0c;能不给大家安排一波&#xff01; 怎么说呢&#xff0c;用这个表白也…

DJ13-1 汇编语言程序设计-1

目录 一、基本概念 1. 机器语言&#xff08;machine language&#xff09; 2. 汇编语言&#xff08;assembly language&#xff09; 3. 汇编语言源程序 4. 汇编&#xff08;assemble&#xff09; 5. 汇编程序&#xff08;assembler&#xff09; 6. 宏汇编程序&#xff0…

[附源码]JAVA毕业设计教材管理(系统+LW)

[附源码]JAVA毕业设计教材管理&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xf…

利用CMOS数字隔离器提高智能计量解决方案的数据完整性和可靠性

介绍 随着消费者从传统的机电电表升级到联网的智能电表&#xff0c;自动读表&#xff08;AMR&#xff09;市场预计在未来几年将以两位数的速度增长。当今先进的智能电表使用最新的集成电路&#xff08;IC&#xff09;技术来准确地测量和报告所消耗的耗电量。虽然智能电表比机电…

【pen200-lab】10.11.1.231

pen200-lab 学习笔记 【pen200-lab】10.11.1.231 &#x1f525;系列专栏&#xff1a;pen200-lab &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f36d;作…

Metabase学习教程:系统管理-2

数据共享指南 在组织内部或外部&#xff0c;共享数据或分析的选项是什么&#xff1f;何时应该使用一种方法而不是另一种方法&#xff1f; 你有数据&#xff0c;你想&#xff08;或被要求&#xff09;分享它。这些数据是一个问题还是一个访问多个数据库完整的问题数据资料室&a…

SpringCloud - Sentinel熔断与限流

文章目录一.Sentinel下载安装运行二.Sentinel初始化监控三.流控规则1. 阈值类型1.1 QPS1.2 线程数2. 流控模式2.1 直接2.2 关联2.3 链路3. 流控效果3.1 快速失败3.2 WarmUp预热3.3 排队等待四.降级规则1. RT2. 异常比例3. 异常数五.Sentinel 热点key1. 基本使用2. 参数例外项六…

Spring Data JPA - Web 支持、排序和分页

在前面的教程中&#xff0c;我们已经看到了如何使用 Spring Data 分页 Web 支持。在本教程中&#xff0c;我们将了解如何使用排序支持。 在基于 Web 的应用程序中应用排序主要有两种方法&#xff1a; 按可分页处理程序参数排序 我们在前面的示例中使用过&#xff0c;但没有任…

【经验】Word 2021|如何在Word里做出和Markdown中一样漂亮的引用样式(结尾附成品)

文章目录写在最前方法以及参数1 打开样式窗口2 设置一些基本操作3 打开格式窗口4 修改样式最后一步&#xff01;保持间隔成品的介绍&#xff08;一些自卖自夸&#xff09;获取链接&#xff08;不想看做法的话直接下载&#xff09;写在最前 Word 版本&#xff1a;2021 这个文章是…

[附源码]JAVA毕业设计技术的游戏交易平台(系统+LW)

[附源码]JAVA毕业设计技术的游戏交易平台&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模拟进行股价预测

全文下载链接&#xff1a;http://tecdat.cn/?p20678在本文中&#xff0c;预测股价已经受到了投资者&#xff0c;政府&#xff0c;企业和学者广泛的关注。然而&#xff0c;数据的非线性和非平稳性使得开发预测模型成为一项复杂而具有挑战性的任务&#xff08;点击文末“阅读原文…

HTML+CSS个人电影网页设计——电影从你的全世界路过(4页)带音乐特效

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…