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.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.HttpServletRequest 和javax.servlet.http.HttpServletResponse 分別改為
jakarta.servlet.http.HttpServletRequest 和jakarta.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ā)中。