Springboot 2.6 升级到Spring Boot 3.0实战及注意事项

Spring boot 在2022年11月24日发布了3.0版本,该版本最大的亮点是可以编译成本地可执行文件,极大地提高java程序运行速度,减少程序运行时资源占用。我已经体验了一把,现分享一下,可以让大家少走点弯路。

一、开发环境IDE升级(JDK17+IDEA 2021.2.4)

因为spring boot 3 需要jdk的版本至少为17,java17是Oracle公司接管后的第一个可长期免费商业使用的版本。用java8这么多年了,终于可以用新的语法糖了,比如:用var关键字来定义变量这个特性C#在十几年前就可以用了,现在升级到java17也可以用了。

要支持java17的开发环境,如果你是用IntelliJ IDEA的话,至少要升级到2021.2.4 +版本了。

二、Spring Cloud 等其他Spring生态类库升级

 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>3.0.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2022.0.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2022.0.0.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

以上是我的pom.xml文件中的部分内容,可见Spring Cloud的主版本为2022.0.0;spring-cloud-alibaba 的主版本为2022.0.0.0,是2022年12月22日发布的候选版,2023年7月26日终于发布了正式版。

Spring boot starter web 3 依赖关系

看上图spring-boot-starter-web 3.0版本的依赖中,spring-web,spring-context版本已经升级到6.0了,如果单独引用的话也要注意版本升级。

三、servlet-api 升级

以前的4.0版本配置:

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>

最新的6.0版本的配置:

        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>

注意升级后包名发生了变化,要将javax.servlet.** 批量改为jakarta.servlet.** 。比如:
javax.servlet.http.HttpServletRequestjavax.servlet.http.HttpServletResponse 分别改为
jakarta.servlet.http.HttpServletRequestjakarta.servlet.http.HttpServletResponse

四、spring-data-redis 升级

spring-data-redis 升级到3.0之后,配置文件发生了变化;
最新的配置如下:

##### redis配置
spring.data.redis.host=192.168.50.101
spring.data.redis.port=6379
spring.data.redis.database=11
spring.data.redis.password=haoxun
spring.data.redis.timeout=5000
spring.data.redis.lettuce.pool.enabled= true
# 连接池最大连接数(使用负值表示没有限制)
spring.data.redis.lettuce.pool.max-active=5
# 连接池中的最大空闲连接
spring.data.redis.lettuce.pool.max-idle=5
# 连接池中的最小空闲连接
spring.data.redis.lettuce.pool.min-idle=1
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.data.redis.lettuce.pool.max-wait=5000
spring.data.redis.lettuce.pool.time-between-eviction-runs=1000

即原来的配置以spring.redis为前缀,现在要批量改为spring.data.redis为前缀;

五、Swagger 升级

改动比较大,因为 com.spring4all» swagger-spring-boot-starter已经停止维护了,所以在Spring boot 3.0下用不了。com.github.xiaoymin» knife4j-spring-boot-starter» 3.03要升级为

<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.0.0</version>

类库名发生了变化,底层不再使用io.springfox.*的类库,注解类库发生变化(由io.swagger» swagger-annotations»1.5.24 变为 io.swagger.core.v3» swagger-annotations-jakarta»2.2.7),因此所有的swagger注解都要重写。具体变化如下:

swagger2注解 swagger3注解 注解位置
@Api @Tag(name = “接口类描述”) Controller 类上
@ApiOperation @Operation(summary =“接口方法描述”) Controller 方法上
@ApiImplicitParams @Parameters Controller 方法上
@ApiImplicitParam @Parameter(description=“参数描述”) Controller 方法上 @Parameters 里
@ApiParam @Parameter(description=“参数描述”) Controller 方法的参数上
@ApiIgnore @Parameter(hidden = true) 或 @Operation(hidden = true) 或 @Hidden 方法或参数
@ApiModel @Schema DTO类上
@ApiModelProperty @Schema DTO属性上

另外还需要定义一个config类来初始化Bean才能运行起来,详见官方的示例代码: https://gitee.com/xiaoym/swagger-bootstrap-ui-demo/tree/master/knife4j-spring-boot3-demo

可是在Spring Cloud Gateway中聚合多个swagger v3文档不支持,我试过了用Knife4jAggregationDesktop来实现是可以的(相关教程:https://www.jianshu.com/p/b6bb950acd0e)。

六、Hystrix和Ribbon已过时

由于Hystrix和Ribbon已停止升级,Hystrix被circuit-breaker(resilience4j或sentinel)取代,Ribbon被load-balancer取代。maven类库引用变为:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
        </dependency>
       或者
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
        </dependency>

七、Druid数据库连接池集成

<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-3-starter -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-3-starter</artifactId>
    <version>1.2.20</version>
</dependency>

2023年5月13日发布的针对Spring Boot 3的新类库,1.2.18版本中Web监控会报404的错误,目前这个问题在1.2.20版本中已经解决。

八、完整的示例代码

Git仓库地址:https://gitee.com/IElwin/ezlcp-java ,各微服务可以正常运行,需要先执行init目录下的数据库脚本,以及导入init目录下的nacos配置。目前项目的基础架构已经完成,业务功能正在开发中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容