
—— Spring Boot 3已经发布了,你还在等待么?
Spring Boot 3.0其实在2022年11月左右就正式发布了. Spring Boot 3.0基于Spring Framework 6.0为基础进行构建.
相比Spring Boot 2.x系列来说, Spring Boot 3.0发生一些显著的变更. 考虑到国内大多数企业和程序员在Java语言中主流都使用的是Spring. 并且最近我也在升级我的myddd适配Spring Boot 3.0. 因此,我在这篇文章列出Spring Boot 3.0中那些值得关注的变更.
1. 变更
事实上,做为一个重大的版本升级,Spring Framework 6或Spring Boot 3有许多依赖上的升级或功能上的新增或变更.
但做为我们最常使用Spring Boot的大多数程序员来说, 值得最需要关注的就是以下这三个点.
2. JDK 17
对于Java程序员来说, 就算到了2023年,可能始终也避免不开JDK 8这个版本. 事实上, 仍然有相当一部分项目使用的是JDK 8. 虽然最新的LTS版本已经到了JDK 17, 但其实连很多年前就有的JDK 11 LTS版本都使用非常少. 更别说JDK 17了.
但事实上, JDK 17无论是在性能,还是一些语言改进上,都有长足的进步. 比如类似文本块, Record记录类, 密封类 等一些优秀的语法特性,都能让你写出更优雅,更好的Java代码.
关于JDK 8以后的那些重要的特性,我过往写过一系列的文章来说明,有兴趣的可以参阅. 文末我会附上链接以供参考.
对于那些仍然停留在JDK 8的程序员来说,我想像的除了遗留项目升级困难,成本过高等因素外, 那些新项目或可以升级的仍然不愿意升级的, 就觉得有不合理了.
做为程序员,不能永远停留不动. 我们永远要保持对新技术的敏感性.
3. Jakarta EE 9
Spring Boot有一个非常重要,使用率非常高的功能就是Spring Data JPA了. 因为操作关系型数据库几乎是许多项目共有的需求. 而以Hibernate为主流的ORM框架因为很好的处理了面向对象与关系型数据库之间的模型冲突,一直是非常受到欢迎.
而在Spring Boot流行之后,慢慢的大家都不再直接使用Hibernate了,而是切换到使用Spring Data JPA.
也许很多人没有搞清楚JPA, Hibernate以及Spring Data JPA三者之间的关系. 所以也可能对Jakarta EE 8或是Jakarta EE 9也不是非常知道.
JPA && Hibernate && Spring Data JPA
JPA是标准, 属于Jakarta EE企业级开发标准的一种. 它是标准.
而Hibernate则实现了JPA的标准,虽然它也可以不基于JPA标准API来使用. 事实上, 除了Hibernate以外,还有Object DB等JPA实现. 如果你是基于JPA标准API来写代码, 意味着你实际上可以切换不同的实现而不需要修改多少代码.
至于Spring Data JPA, 它既不是JPA类似的标准, 也不是Hibernate这样的实现, 它其实是一种封装与抽象. 它其实背后使用的是Hibernate来实现. 只是做了一层封装, 比如让你只写接口就能操作数据库.
Java EE 8 && Jakarta EE 8 && Jakarta EE 9
其实我写过一篇文章来详细说明这三者的关系与演进, 我会在文末附上链接.
在这里,我再简单的阐述一下.
Java被Oracle收购后, Java EE做为其企业级开发, 同样归于Oralce. 但后面Oralce不愿意维护它了,于是把它捐助给了Eclipse基金会, 但Oralce在捐助时又要求Eclipse修改名称,不允许沿用Java EE的品牌名及包名(javax.*)
于是, 捐助后就变成了Jakarta EE 8, Jakarta EE 8与Java EE 8在功能上几乎完全一模一样,只是修改了名称与包名.
Jakarta EE 9才是真正意义上的新版本升级. 比如它里面的JPA标准是3.0,而非过往的2.1了
升级影响点
当然,对于使用Spring Data JPA的你来说,最重要的就是一些包名的替换与变更.
以我的myddd适配Spring Boot 3.0来说明.

4. GraalVM native原生支持
如果你还没听过GraalVM native是什么,那我接下来要说的可能还是有点价值.
Java这门语言,说好它很好,说问题也一大堆. 其中最重要的一个东西就是Java源码是编译为字节码,是JVM来解释运行的. 这是它能做到跨平台的很重要的一个原因. 因为它在不同的系统上实现了JVM.
但是,现在是云原生时代. 一切服务都希望能云上部署与运行. 而云上部署与运行的一个重要的优势就是要小,快. 这刚好是Java这门语言不具备的.
所以我们在说FaaS时,发现都基本是用Node.js语言. 因为它非常小,快. 不像Java这么重量级,需要一个JVM这么一个东西.
解决Java这个问题的方案无非有两种, 一种是抛弃Java,用其它性能更好的语言, 比如Go或Rust. 另一种就是改进Java.
Java做为最流行的企业级开发语言,生态相当强大,放弃是不可能轻易放弃的. 所以,Oralce推出了GraalVM native.
GraalVM native的思路是仍然使用Java语言,但在编译阶段就编译成机器码,而非字节码. 这样就不需要JVM运行了.变成了系统原生程序了. 性能就大幅度提升了. 当然, 这也意味着你在不同的操作系统上需要编译各自的程序了.
GraalVM native存在很久了, 一直不断的在改进与优化中. 但是它仍然很难普及. 一个相当重要的原因就是类似没有Spring Boot的支持.
想像下, 如果Spring Boot已原生支持GraalVM native, 那对于未来使用Spring Boot的公司或团队来说, 为了性能而进一步使用它的GraalVM native能力, 也就是顺利成章的事了.
附录
关于JDK 8之后的新特性, 我总结过JDK 8 到 JDK 17的那些重要的新特性,你可以阅读我写的文章以了解.
- Java 8之后的那些新特性(一):局部变量var
- Java 8之后的那些新特性(二):文本块 Text Blocks
- Java 8之后的那些新特性(三):Java System Logger
- Java 8之后的那些新特性(四):网络请求 Java Http Client
- Java 8之后的那些新特性(五): Helpful NullPointerExceptions
- Java 8之后的那些新特性(六):记录类 Record Class
- Java 8之后的那些新特性(八):模式匹配 Pattern Matching
- Java 8之后的那些新特性(九):密封类与接口 Sealed Classes and Interfaces
- Java 8之后的那些新特性(七):switch表达式 Switch Expressions
- Java 8之后的那些新特性(终):27年后,为什么Java仍然能够长盛不衰
关于JAVA EE的变迁,可以参阅我写的文章