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.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.HttpServletRequest
和javax.servlet.http.HttpServletResponse
分别改为
jakarta.servlet.http.HttpServletRequest
和jakarta.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来实现是可以的(相关教程://www.greatytc.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配置。目前项目的基础架构已经完成,业务功能正在开发中。