Springboot 2.6 升級到Spring Boot 3.0實戰(zhàn)及注意事項

Spring boot 在2022年11月24日發(fā)布了3.0版本,該版本最大的亮點是可以編譯成本地可執(zhí)行文件,極大地提高java程序運行速度,減少程序運行時資源占用。我已經(jīng)體驗了一把,現(xiàn)分享一下,可以讓大家少走點彎路。

一、開發(fā)環(huán)境IDE升級(JDK17+IDEA 2021.2.4)

因為spring boot 3 需要jdk的版本至少為17,java17是Oracle公司接管后的第一個可長期免費商業(yè)使用的版本。用java8這么多年了,終于可以用新的語法糖了,比如:用var關(guān)鍵字來定義變量這個特性C#在十幾年前就可以用了,現(xiàn)在升級到j(luò)ava17也可以用了。

要支持java17的開發(fā)環(huán)境,如果你是用IntelliJ IDEA的話,至少要升級到2021.2.4 +版本了。

二、Spring Cloud 等其他Spring生態(tài)類庫升級

 <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文件中的部分內(nèi)容,可見Spring Cloud的主版本為2022.0.0;spring-cloud-alibaba 的主版本為2022.0.0.0,是2022年12月22日發(fā)布的候選版,2023年7月26日終于發(fā)布了正式版。

Spring boot starter web 3 依賴關(guān)系

看上圖spring-boot-starter-web 3.0版本的依賴中,spring-web,spring-context版本已經(jīng)升級到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>

注意升級后包名發(fā)生了變化,要將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之后,配置文件發(fā)生了變化;
最新的配置如下:

##### 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
# 連接池最大連接數(shù)(使用負值表示沒有限制)
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為前綴,現(xiàn)在要批量改為spring.data.redis為前綴;

五、Swagger 升級

改動比較大,因為 com.spring4all? swagger-spring-boot-starter已經(jīng)停止維護了,所以在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>

類庫名發(fā)生了變化,底層不再使用io.springfox.*的類庫,注解類庫發(fā)生變化(由io.swagger? swagger-annotations?1.5.24 變?yōu)? 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=“參數(shù)描述”) Controller 方法上 @Parameters 里
@ApiParam @Parameter(description=“參數(shù)描述”) Controller 方法的參數(shù)上
@ApiIgnore @Parameter(hidden = true) 或 @Operation(hidden = true) 或 @Hidden 方法或參數(shù)
@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來實現(xiàn)是可以的(相關(guān)教程:http://www.itdecent.cn/p/b6bb950acd0e)。

六、Hystrix和Ribbon已過時

由于Hystrix和Ribbon已停止升級,Hystrix被circuit-breaker(resilience4j或sentinel)取代,Ribbon被load-balancer取代。maven類庫引用變?yōu)?

        <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數(shù)據(jù)庫連接池集成

<!-- 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日發(fā)布的針對Spring Boot 3的新類庫,1.2.18版本中Web監(jiān)控會報404的錯誤,目前這個問題在1.2.20版本中已經(jīng)解決。

八、完整的示例代碼

Git倉庫地址:https://gitee.com/IElwin/ezlcp-java ,各微服務(wù)可以正常運行,需要先執(zhí)行init目錄下的數(shù)據(jù)庫腳本,以及導(dǎo)入init目錄下的nacos配置。目前項目的基礎(chǔ)架構(gòu)已經(jīng)完成,業(yè)務(wù)功能正在開發(fā)中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容