去年把项目从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的理解深了不少。技术迭代快,保持学习的心态很重要。
有问题欢迎留言交流~