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 /health和GET /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 {
@Bean
public 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 {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
}
}
展望未来,推荐的方法是注册一个 SecurityFilterChain bean:
@Configuration
public class SecurityConfiguration {
@Bean
public 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<>() {
@Override
public void onFailure(Throwable ex) {
log.error(ex);
}
@Override
public 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>
今日分享就到这里,感谢阅读!如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!
欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源
Spring Boot 2.x 到 3.2 的全面升级指南的更多相关文章
- 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南
[SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...
- spring boot 简介(基于SSM框架的一个升级版本吧)
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...
- spring boot 笔记--第三章
spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...
- 再见 Spring Boot 1.X ,Spring Boot 2.X 走向舞台中心
2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束. 其实早在2018年7月30号,Spring 官方就已经 ...
- Spring Boot 2.2.2.RELEASE 版本中文参考文档【3.1】
使用Spring Boot 本节将详细介绍如何使用Spring Boot.它涵盖了诸如构建系统,自动配置以及如何运行应用程序之类的主题.我们还将介绍一些Spring Boot最佳实践.尽管Spring ...
- Spring Boot 2.2.1 发布,一个有点坑的版本!
上一篇:Spring Boot 2.2.0 正式发布,支持 JDK 13! Spring Boot 2.2.0 没发布多久,Spring Boot 2.2.1 又发布了,这是一个很有意思,又有点 &q ...
- SpringBoot官方文档学习(二)使用Spring Boot构建系统
强烈建议您选择一个支持依赖关系管理并且可以使用发布到“ Maven Central”仓库的构建系统.我们建议您选择Maven或Gradle.其他构建系统(例如,Ant)也可以和Spring Boot一 ...
- Spring Boot的前世今生以及它和Spring Cloud的关系详解。
要了解Spring Boot的发展背景,还得从2004年Spring Framework1.0版本发布开始说起,不过大家都是从开始学习Java就使用Spring Framework了,所以就不做过多展 ...
- 玩转spring boot——快速开始
开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...
- 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)
Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...
随机推荐
- nodejs实现的一个简单粗暴的洗牌算法
据说名字长别人不一定看得到 之前用python,自带shuffle用的还是超爽的: 去年6月份自己动手用nodejs写一个21点扑克游戏的后台时,就需要一个洗牌算法,于是简单粗暴的实现了一个. 贴出来 ...
- 【python爬虫】爬虫所需要的爬虫代理ip是什么?
前言 在进行爬虫程序开发时,经常会遇到访问被限制的网站,这时就需要使用代理 IP 来进行访问.本文将介绍代理 IP 的概念及使用方法,帮助读者更好地应对爬虫程序中的访问限制问题.同时,本文还将提供一些 ...
- HashMap底层源码分析
HashMap底层原理实现 1.HashMap初始化 jdk1.8版本之后:数组+链表+红黑树实现,先去观看HashMap的构造方法: 构造方法: public HashMap() { this.lo ...
- Java新特性中的Preview功能如何运行和调试
在每个Java新版本发布的特性中,都会包含一些Preview(预览)功能,这些功能主要用来给开发者体验并收集建议.所以,Preview阶段的功能并不是默认开启的. 如果想体验某个Java版本中的Pre ...
- 造轮子之ORM集成
Dotnet的ORM千千万,还是喜欢用EF CORE 前面一些基础完成的差不多了,接下来可以集成数据库了,官方出品的ORM还是比较香.所以接下来就是来集成EF CORE. 安装包 首先我们需要安装一下 ...
- FFMPEG+SDL简单视频播放器——视频快进
之前写过一篇关于视频播放器的文章.播放器只简单实现了视频播放的功能,在此功能的基础上,给它加上一个视频快进的功能. 实现 添加参数 // video play control bool do_seek ...
- 今天的第二道tarjan:受欢迎的牛
原题来自:USACO 2003 Fall 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢&quo ...
- ExtJS的使用方法汇总(1)——配置和表格控件使用
在网上差一些关于ExtJS的相关资料,看到这篇博客写的不错,拿出来分享一下! 博客文章:ExtJS的使用方法汇总(1)--配置和表格控件使用 ExtJS的使用方法汇总(2)- ...
- 银河麒麟V10 SP1忘记账户密码后重置/更改账户密码
开机进入选择界面,按下键盘E键 光标通过键盘上下左右键移到linux行最后一句(此处是seurity=kysec后) 输入空格 console=tty1 single 按下F10键,等待重启 输入pa ...
- 大一下c语言课程设计
// // main.c // 高级语言课程设计图书管理系统 // // Created by 蔡星旖 on 2022/8/1. // #include <iostream> #inclu ...