Spring Boot 2.x 到 3.2 的全面升级指南

Spring Framework 是一种流行的开源企业级框架,用于创建在 Java Virtual Machine (JVM) 上运行的独立、生产级应用程序。而Spring Boot 是一个工具,可以让使用 Spring 框架更快、更轻松地开发 Web 应用程序和微服务。随着 Spring Boot 的不断发展,开发人员必须跟上最新的升级和变化。

最近,Spring Boot 宣布发布 3.2.x 版本,该版本带来了多项新功能、错误修复和增强功能,鉴于对 Spring Boot 2.7.x 版本的支持已于 2023 年 11 月 18 日结束,这是一个非常重要且强制性的关注用于将 Spring Boot 应用程序升级到最新的 3.x 版本。

因此,在本文中,我们将讨论如何从 Spring Boot 2.x 迁移到 3.x,以及升级的优势以及开发人员在此过程中可能遇到的潜在困难。

升级指南

1. 升级 JDK 17

Spring Boot 3.0 需要 Java 17 作为最低版本。

如果您当前使用的是 Java 8 或 Java 11,则需要在 Spring Boot 迁移之前升级 JDK。

2. 升级到 Spring Boot 3

查看项目及其依赖项的状态后,请升级到 Spring Boot 3.0 的最新维护版本。

我们将使用 Spring Boot 3.2.0 进行升级。

打开项目的 pom.xml 并更新 Spring Boot 的版本,如下所示。

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.0</version>
</parent>

3. 配置属性迁移

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

为了帮助您实现这一点,Spring Boot 提供了一个 spring-boot-properties-migrator 模块。

我们可以通过将以下内容添加到 Maven pom.xml 来添加迁移器:

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

4. 升级到 Jakarta EE

由于 Java EE 已更改为 Jakarta EE,Spring Boot 3.x 的所有依赖项 API 也从 Java EE 升级为 Jakarta EE。

简单来说,您需要将所有 javax 的 imports 都替换为 jakarta。具体如下:

javax.persistence.*   -> jakarta.persistence.*
javax.validation.*    -> jakarta.validation.*
javax.servlet.*       -> jakarta.servlet.*
javax.annotation.*    -> jakarta.annotation.*
javax.transaction.*   -> jakarta.transaction.*

5. 调整@ConstructorBinding注解

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

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

6. Spring MVC 和 WebFlux的URL匹配更改

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

这意味着以前,以下控制器将匹配GET /healthGET /health/

@RestController
public class HealthController {@GetMapping("/health")public String health() {return "Application is Working";}}@RestController
public class HealthController {@GetMapping("/health")public Mono<String> health() {return Mono.just("Application is Working");}}

7. RestTemplate 中的 Apache HttpClient

Spring Framework 6.0 中已删除对 Apache HttpClient 的支持,现在由 org.apache.httpcomponents.client5:httpclient5 取代(注意:此依赖项具有不同的 groupId)。

如果您注意到 HTTP 客户端行为存在问题,则 RestTemplate 可能会回退到 JDK 客户端。

org.apache.httpcomponents:httpclient 可以由其他依赖项传递传递,因此您的应用程序可能依赖此依赖项而不声明它。

下面是迁移后的RestTemplate示例:

@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(){final SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactoryBuilder.create().build();final PoolingHttpClientConnectionManager manager = PoolingHttpClientConnectionManagerBuilder.create().setSSLSocketFactory(sslConnectionSocketFactory).build();final CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(manager).build();final HttpComponentsClientHttpRequestFactory componentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();componentsClientHttpRequestFactory.setHttpClient(closeableHttpClient);final RestTemplate restTemplate = new RestTemplate(componentsClientHttpRequestFactory);return  restTemplate;}
}

8. 升级 Spring Security

Spring Boot 3.0 已升级到 Spring Security 6.0。

因此,WebSecurityConfigurerAdapter 已被弃用。 Spring鼓励用户转向基于组件的安全配置。

为了演示新的配置风格,我们使用 Spring Security lambda DSL 和方法 HttpSecurity#authorizeHttpRequests 来定义我们的授权规则。

下面是使用 WebSecurityConfigurerAdapter 的示例配置,它通过 HTTP Basic 保护所有端点:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authz) -> authz.anyRequest().authenticated()).httpBasic(withDefaults());}}

展望未来,推荐的方法是注册一个 SecurityFilterChain bean:

@Configuration
public class SecurityConfiguration {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authz) -> authz.anyRequest().authenticated()).httpBasic(withDefaults());return http.build();}}

9. Spring Kafka 模板升级

KafkaTemplate 方法现在返回 CompleteableFuture 而不是 ListenableFuture,后者已被弃用。

Spring Boot 2.x 中带有 ListenableFuture 的 Kafka 模板:

private RoutingKafkaTemplate routingKafkaTemplate;public void send(){ListenableFuture<SendResult<Object,Object>> future = routingKafkaTemplate.send("Message","topic");future.addCallback(new ListenableFutureCallback<>() {@Overridepublic void onFailure(Throwable ex) {log.error(ex);}@Overridepublic void onSuccess(SendResult<Object, Object> result) {log.info("success");}});
}

Spring Boot 3.x 中带有 CompletableFuture 的 Kafka 模板:

private RoutingKafkaTemplate routingKafkaTemplate;public void send() {CompletableFuture<SendResult<Object, Object>> future = routingKafkaTemplate.send("Message", "topic");future.thenAccept(log::info).exceptionally(exception -> {log.error(exception);return null;});
}

10. Spring Doc OpenAPI 升级

springdoc-openapi用于为Spring Boot 项目自动生成 API 文档。

springdoc-openapi的工作原理是在运行时检查应用程序,以根据 spring 配置、类结构和各种注释推断 API 语义。

对于 spring-boot 3 支持,请确保使用 springdoc-openapi v2。

WebMVC 项目的 Spring Doc OpenAPI 升级

对于 WebMVC 项目,您需要在 pom.xml. 文件中包含以下依赖项。

<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.3.0</version>
</dependency>
WebFlux 项目的 Spring Doc OpenAPI 升级

对于 WebFlux 项目,您需要在 pom.xml. 文件中包含以下依赖项。

<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webflux-ui</artifactId><version>2.3.0</version>
</dependency>

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

今日分享就到这里,感谢阅读!

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

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

相关文章

canvas绘制旋转的椭圆花

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

MySQL-函数-日期函数

常见的日期函数 案例

Flutter中extension扩展类介绍及使用指南

Flutter 是一种流行的跨平台移动应用开发框架&#xff0c;由Google推出。在Flutter的世界中&#xff0c;扩展类(extension)是一种强大的工具&#xff0c;可以帮助开发者更好地组织和重用代码。本文将介绍Flutter中扩展类的基本概念&#xff0c;并展示如何在你的应用程序中有效地…

Hypervisor 和Docker 还有Qemu有什么区别与联系?

Hypervisor Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层&#xff0c;可以让多个操作系统和应用共享硬件资源&#xff0c;也叫做虚拟机监视器&#xff08;VMM&#xff09;。 Hypervisor有两种类型&#xff1a;Type I和Type II。 Type I 直接运行在硬件上&a…

Http常用状态码

200 OK 请求成功。 201 Created 该请求已成功&#xff0c;并因此创建了一个新的资源。这通常是在PUT请求之后发送的响应。 204 No Content 服务器成功处理了请求&#xff0c;但不需要返回任何实体内容&#xff0c;并且希望返回更新了的元信息。响应可能通过实体头部的形式…

LabVIEW电火花线切割放电点位置

介绍了一个电火花线切割放电点位置分布评价系统&#xff0c;特别是在系统组成、硬件选择和LabVIEW软件应用方面。 本系统由两个主要部分组成&#xff1a;硬件和软件。硬件部分包括电流传感器、高速数据采集卡、开关电源、电阻和导线。软件部分则由LabVIEW编程环境构成&#xf…

复杂高层建筑环境多模态导航服务和引导管理机器人系统设计(预告)

课题基础 机器人工程ROS方向应用型本科毕业设计重点课题学生验收成果 将上面这篇所涉及的算法等应用到如下环境中。 Gazebo新环境AWS RoboMaker Hospital医院场景适用于ROS1和ROS2 高层可以简化为多层测试。最典型的就是两层及以上。 简介 随着城市化进程的加速和高层建筑…

[系统安全] 五十五.恶意软件分析 (7)IDA Python基础用法及CFG控制流图提取详解[上]

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

数据结构(更新至链表)

数组 数组的代码 public class Myarr<T> {private int capacity0;private int size0;private T[]arr;//如果是空的则强制将容量扩充为10public Myarr(int capacity) {if (this.size 0) {this.capacity 10;this.arr(T[]) new Object[this.capacity];}}//按顺序添加数据…

docker清理垃圾命令

如果使用 docker 进行大规模开发&#xff0c;但是没有清理策略&#xff0c;那么的磁盘马上就会被填满&#xff0c;进而会影响整个ci/cd的流程。 docker积累的垃圾&#xff0c;包括&#xff1a; 已经停止的容器远古镜像磁盘卷默认网络 清理停止的容器 docker rm -v $(docker…

中美比特币储备曝光

作者&#xff1a;秦晋 自1月10日&#xff0c;美国SEC审批通过包含贝莱德在内的11只比特币现货ETF之后&#xff0c;短时间内&#xff0c;其总交易量已超过130亿美元。其资产管理规模超过白银ETF&#xff0c;成为美国第二大ETF商品类别。 据《Bitcoin Magazine》报道&#xff0c;…

分享一个“产业级,开箱即用”的NLP自然语言处理工具

NLP的全称是Natuarl Language Processing&#xff0c;中文意思是自然语言处理&#xff0c;是人工智能领域的一个重要方向 自然语言处理&#xff08;NLP&#xff09;的一个最伟大的方面是跨越多个领域的计算研究&#xff0c;从人工智能到计算语言学的多个计算研究领域都在研究计…

JAVASE进阶(设计模式、设计原则)(更新中...)

目录 一、注解 内置注解&#xff1a;JAVA中已经定义好的注解。 元注解&#xff1a;修饰注解的注解。 自定义注解。 二、克隆 JAVA中对clone的实现&#xff1f; 浅克隆 深克隆 那么该如何做到深克隆呢&#xff1f; 三、常用设计模式 1、创建型模式 单例模式 工厂模式 工…

【GitHub项目推荐--一个语音机器人项目】【转载】

推荐一个腾讯大佬开源的语音对话机器人&#xff1a;wukong-robot &#xff0c;悟空机器人在 GitHub 上斩获 3.2K 的 Star。 这是一个简单灵活的中文语音对话机器人项目&#xff0c;目的是让中国的开发者也能快速打造个性化的智能音箱&#xff0c;同时&#xff0c;该项目还是第…

网络安全进阶试题——附答案

选择题 以下哪个是网络安全的首要原则&#xff1f; A. 开放访问B. 机密性C. 全球畅通D. 数据泄露 什么是“零信任”安全模型的核心概念&#xff1f; A. 信任所有用户B. 信任无线网络C. 从内到外建立信任D. 不信任任何用户&#xff0c;无论其在内部还是外部 常见的社交工程攻击手…

QTableWidget 双击单元格修改数据

本章介绍通过双击单元格&#xff0c;进入单元格&#xff0c;进行编辑&#xff0c;并对比是否修改了数据&#xff0c;如果修改了更新到数据库。 其他关于QTableWidget的操作&#xff0c;请查看上一篇文章《QTableWidget 用法-CSDN博客》 修改单元格内容&#xff0c;与原值比较…

vue3 npm i 一直卡到不动

一. 首先node 版本要18.0及以上 查看node版本并安装指定版本 二. 查看npm镜像源以及指定安装npm的镜像 三. 删除项目中的package-lock.json文件 最好是把node_modules安装包也删除掉&#xff0c;然后npm i 就可以了

2024年开启重学前端和深入浅出系列

我回来了&#xff0c;2024年决定开启前端重学系列和深入浅出系列 系统化输出文章&#xff0c;后期出书或掘金小册子 2024年决定输出&#xff1a; 重学CSS3系列 重学JS系列 重学ES6系列 深入浅出Vue3 深入浅出微前端&#xff08;qiankun、wujie&#xff09; Vue3源码分析…

(十三)Head first design patterns原型模式(c++)

原型模式 原型模式就是就是对对象的克隆。有一些私有变量外界难以访问&#xff0c;而原型模式可以做到对原型一比一的复刻。 其关键代码为下面的clone方法。此方法将本对象进行复制传递出去。 class ConcretePrototype1 : public Prototype{ public:ConcretePrototype1(stri…

配置jdk环境变量

查看jdk在什么地方的命令 echo $JAVA_HOME 查看jdk的执行路径--使用which java whereis java zip -qr jdk21.zip jdk21/ 手动配置Java环境变量 修改配置环境 vim /etc/profile 把下面的配置放到文件的最后一行 export JAVA_HOME/usr/local/jdk1.8.0_202 # 这里设置…