恋上蓝花楹

Spring Boot 3.x实战:那些让我又爱又恨的新特性

去年把项目从Spring Boot 2.7升级到3.1,折腾了一周,踩了不少坑。今天把这段经历整理出来,希望能帮到同样在升级路上挣扎的朋友。

为什么升级?

说实话,一开始是不想动的。2.7用得好好的,为什么要升级?直到看到那个诱人的特性:虚拟线程

项目里有个批量处理任务,用线程池跑,代码写得我心累。虚拟线程号称能让并发代码像同步代码一样简单,这个诱惑太大了。

升级过程中的坑

坑一:JDK版本必须17+

这个其实文档写了,但我没仔细看。项目还在用JDK 11,直接升Spring Boot 3,启动直接报错。无奈又把JDK升级到17。

好消息是JDK 17的 sealed class 和 record 用起来很舒服,特别是record,替换那些POJO类简直不要太爽。

坑二:javax变jakarta

这个是最痛苦的。所有 javax.* 包名都要改成 jakarta.*

不只是改import,依赖也要换。我项目里用了MyBatis Plus、Swagger、一些第三方库,全都要升级到支持jakarta的版本。有些库还没出jakarta版本,只能找替代品。

Swagger换成了SpringDoc,Knife4j也升级到4.x版本才支持。

坑三:虚拟线程不是银弹

好不容易配置好虚拟线程,兴冲冲地测试,结果发现性能反而下降了。

研究了一番才发现,虚拟线程适合 IO密集型 任务,不适合CPU密集型。我们的批量处理里有大量数据计算,用虚拟线程反而是负优化。

但好消息是,Web层的接口性能确实提升了,特别是那些调用外部API的接口。

值得升级吗?

折腾一周后,我的答案是:看情况

如果项目稳定运行,没有特别需要的新特性,可以再等等。Spring Boot 2.7的LTS支持会持续一段时间。

但如果需要原生镜像、虚拟线程这些特性,或者依赖库都已经支持Spring Boot 3了,那就升吧。虽然过程痛苦,但升级后确实有不少改进。

几点建议

  • 先看依赖:确认所有关键依赖都支持Spring Boot 3,否则会很痛苦
  • 准备测试用例:没有测试用例,升级就是在赌博
  • 虚拟线程要慎重:先理解原理,再决定用不用
  • 关注性能:升级后做一次完整的性能测试

最后,升级本身也是一种学习。折腾这周,对Spring Boot的理解深了不少。技术迭代快,保持学习的心态很重要。

有问题欢迎留言交流~

wulilele

我是一名热爱科技与AI的软件工程师。