背景

最近把项目中的技术框架做一次升级,最重要的就是SpringBoot从2.7.x升级到3.0.x,当然还会有一些周边的框架也会连带着升级,比如Mybatis Plus,SpringCloud等,话不多说直接看看有哪些事情要做。

具体事项

主要分两类,第一类是单纯的提升版本,主要如下:

1.jdk升级

SpringBoot3需要jdk17以上,看下官网的介绍。

2.构建工具Maven需要升级,3.5+以上。

3.SpringCloud需要升级,原来是2021.0.3,现在决定升级到2022.0.4,中途也尝试过SpringCloud暂时不升级,但是启动失败了,果断决定升级,二者的对照关系请参考https://start.spring.io/actuator/info。

4.Mybatis,Mybatis-plus需要升级,分别升级到3.5.13,3.5.3.2。

第二类是由于版本升级带来的一些配置和代码的变更,主要如下:

1. javax.需要批量替换

import javax.annotation. 替换为import jakarta.annotation.

import javax.servlet.替换为import jakarta.servlet.

这个我也是有点不解,为什么连路径都要做迁移,这个会有一些连带的改变,比如使用的一些第三方jar使用的是javax.servlet/annotation,那我们就需要找到其高版本看是否切换到了jakarta.servlet/annotation,如果不支持那我们的整体升级可能都要叫停,刚开始也想过找到一些老的jar保证编译不报错,但是运行的时候发现根本不行,因为SpringBoot,Spring等在底层使用的时候都切到了jakarta,为了适应新版本框架必须要改,庆幸的是用的第三方jar都有相应的高版本支持。

2.Spring Cloud OpenFeign升级以后,FeignContext不存在

之前有框架代码中获取FeignBean的需求,代码如下:

public static <T> T getFeignBean(String beanName, Class<T> tClass) {
FeignContext feignContext = (FeignContext)getBean("feignContext");
return feignContext.getInstance(beanName, tClass);
}

需要调整为FeignClientFactory:

public static <T> T getFeignBean(String beanName, Class<T> tClass) {
FeignClientFactory feignContext = (FeignClientFactory)getBean("feignContext");
return feignContext.getInstance(beanName, tClass);
}

3.redis配置修改

之前是spring.redis.xxx,现在需要修改为spring.data.redis.xxx。

4.mybatis plus由3.2.0升级到3.5.3.2以后带来的几个调整

4.1 id-type: UUID调整为id-type: ASSIGN_UUID

4.2 拦截器路径以及构造方式的变化

之前如下:

@Configuration
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}

现在如下:

@Configuration
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}

4.3 selectCount返回值由Integer变更为Long

这个好改,直接按照idea的提示改成Math.toIntExact(xxxMapper.selectCount)。

带来的好处

先说说我最直观的一个好处,jdk由11升级到17以后空指针的异常提示清晰多了,可以明确的知道是哪个对象空,分别以jdk11和jdk17为例测试一段链式调用的NPE异常,测试代码如下:

static class User{
int age;
public int getAge(){
return age;
}
} @Test
public void testNPE(){
List<User> list = new ArrayList();
list.add(null);
list.stream().filter(o -> o.getAge() >9).collect(Collectors.toList())
}

分别看下在jdk11和jdk17下的报错提示。

jdk11

java.lang.NullPointerException
at NpeTest.lambda$testNPE$0(NpeTest.java:41)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at NpeTest.testNPE(NpeTest.java:41)

jdk17

java.lang.NullPointerException: Cannot invoke "NpeTest$User.getAge()" because "o" is null
at NpeTest.lambda$testNPE$0(NpeTest.java:41)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)

其次就是一次老生常谈的好处,比如性能提升,安全加固等,我了解的还很浅薄,待我慢慢发掘以后再跟大家分享。

推荐阅读

https://spring.io/blog/2022/05/24/preparing-for-spring-boot-3-0

https://docs.spring.io/spring-boot/docs/3.0.10/reference/htmlsingle/#getting-help

https://github.com/spring-projects-experimental/spring-boot-migrator

https://blog.csdn.net/dreamcatcher1314/article/details/131137388

SpringBoot2.7升级到3.0的实践分享的更多相关文章

  1. vue 2.0 开发实践总结之疑难篇

    续上一篇文章:vue2.0 开发实践总结之入门篇 ,如果没有看过的可以移步看一下. 本篇文章目录如下: 1.  vue 组件的说明和使用 2.  vuex在实际开发中的使用 3.  开发实践总结 1. ...

  2. PL/0编译器实践---后记

    花了几天时间,把清华版的<编译原理>一书中的PL/0编译器实践了一遍.颇有收获,记录如下: 理解代码的技巧,如何理解一份代码,比如这个程序,其逻辑相对于一般程序就比较复杂了,如何翻译,虚拟 ...

  3. ADT for Eclipse无法升级到23.0的解决方法(确保您的网络能够访问google的地址)

    进行以下步骤时,请确保您的网络能够访问google的地址,因为有可能是无法访问google地址导致无法升级,该文不是为了解决这个问题!!! 最近一次的升级,ADT无法从ADT 22.X升级到23.0. ...

  4. vue2.0 开发实践总结之入门篇

    vue2.0 据说也出了很久了,博主终于操了一次实刀. 整体项目采用  vue +  vue-router +  vuex (传说中的vue 全家桶 ),构建工具使用尤大大推出的vue-cli 后续文 ...

  5. Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)

    Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8) 本次演示为升级oracle rac数据库,用GI的psu升级,从11.2.0.4.0升级到11.2.0.4.8 ...

  6. 系统补丁更新导致MVC3.0.0升级到3.0.1的问题解决

    在更新了系统补丁之后,会不知觉的将MVC3.0.0升级到MVC3.0.1的问题,解决的思路如下: 1.全部MVC引用使用NuGet进行包的管理. 2.单独把MVC库抽离出来,然后放在单独的项目文件夹, ...

  7. CMS .NET 程序框架 从2.0/3.5升级到4.0 版本后 需要调整的地方

    问题一: document.forms1.action 不可使用 需要修改程 document.forms[0] .NET 程序框架 从2.0/3.5升级到4.0 版本后,document.forms ...

  8. foxmail 6.5升级到7.0版本后,旧邮件的导入处理

    随着foxmail 7.0版的火热升级,部分从foxmial 6.5版升级到7.0版的用户可能会出现旧邮件丢失的困扰.这里,foxmail为大家提供的解决方案如下:   打开Foxmail,点击 文件 ...

  9. xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题)

    xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题) 前两天为了适配 iOS10 的系统 我将xcode 7.3 升级到了 xcode 8.0 但是 ...

  10. 升级到tomcat7.0碰到的问题

    今天把tomcat从6.0.18升级到7.0.25,发现了两个问题 问题1 java.lang.ClassNotFoundException: org.apache.catalina.mbeans.S ...

随机推荐

  1. CKS 考试题整理 (14)-启用API Server认证

    Context 由 kubeadm 创建的cluster 的kubernetes API 服务器,出于测试目的, 临时配置允许未经身份验证和未经授权的访问,授予匿名用户 cluster-admin 的 ...

  2. 蔬菜识别系统Python+TensorFlow+Django+卷积神经网络算法

    一.介绍 蔬菜识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法.并通过对数据集进行训练,最后得到一个识别精度较高的模型.并基于Django框架,开 ...

  3. 【C#/.NET】使用Automapper映射record类型

    ​ 当使用Automapper进行对象映射时,通常我们会使用POCO(Plain Old CLR Object)类作为源对象和目标对象.然而,自从C# 9引入了record类型,它们提供了更简洁.不可 ...

  4. Docker、CICD持续集成部署、Gitlab使用、Jenkins介绍

    目录 1.Docker的基本操作 1.1镜像拉取 1.2镜像的操作 1.3容器的操作 运行容器 查看正在运行的容器 查看容器运行日志 进入到容器内部 停止容器运行 删除容器 启动容器 2.Docker ...

  5. CF103B Cthulhu题解

    CF103B Cthulhu 点击查看题目 点击查看思路 如果 \(n < m\),那么会形成多个环. 如果 \(n > m\),那么不会形成环. 只有 \(n = m\) 时会形成环, ...

  6. 10/29/2017_C语言_三道题

    1. 用标准C编程:找出整形数字1-100之间的素数,并打印出来.(素数:除了1和自己本身可以被整除.) 2. 用标准C编程:有两个整形变量m.n,求出这两个数的最小公倍数. 3. 用标准C编程:输出 ...

  7. 【NestJS系列】核心概念:Controller控制器

    前言 控制器主要是用来处理客户端传入的请求并向客户端返回响应. 它一般是用来做路由导航的,内部路由机制控制哪个控制器接收哪些请求. 路由 为了创建基本控制器,我们需要使用@Controller装饰器, ...

  8. Centos7下Oracle启动命令

    1.查询挂载历史记录 在root账户下使用一下命令 查看历史使用挂载的那个磁盘 # 查看挂载历史命令 history | grep mount # 调用挂载历史命令,主要是为了找到挂载Oracle的磁 ...

  9. 你真正了解Spring的工作原理吗

     Spring   1.1 什么是Spring IOC 和DI ?   ① 控制反转(IOC):Spring容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用Spring ...

  10. 记录一次线上服务CPU飙高问题

    2023.07.20 20:01:38线上一个服务发生了CPU过高的告警, 看告警信息当前的CPU使用率已经达到了82.65%,问题已经很严重,赶紧开始排查起来.来复盘下如何排查这类问题, 一.排查方 ...