SpringBoot 3.0现已正式发布,可以在Maven Central中找到。
这是自四年前发布2.0以来的第一个主要版本。它也是SpringBoot的第一个GA版本,提供了对Spring Framework 6.0和GraalVM的支持。
新版本的亮点包括:
- 基于Java 17
- 支持使用GraalVM生成本机镜像,取代了实验性的Spring Native项目
- 通过测微计和测微计跟踪提高可观察性
- 支持Jakarta EE 10和EE 9基线
最大亮点是用GraalVM提前编译AOT升级了Spring-Native:
支持使用GraalVM将Spring应用编译成本地可执行的镜像文件,可以显着提高启动速度和峰值性能,减少内存占用。
传统的应用程序是编译成字节码,然后由JVM解释,最后编译成机器码运行,而Spring Native是通过AOT提前编译成机器码,运行时直接静态编译成可执行文件。
提前编译AOT实际上就是不通过中间步骤(字节码,然后即时JIT编译器),而是在过程的一开始就把源代码编译成最终版本。
这种方法使得提前优化和生成机器代码成为可能,同时摆脱了所有的JVM臃肿,如Classpath或虚拟机本身。
然而,这也不是免费的:
由Graal VM编译的应用程序必须在 "封闭世界假设 "下工作。
这意味着,应用程序中所有可以在运行时调用的字节码必须在构建时已经知道(也能被观察到和分析)。
这对使用反射机制的程序影响特别大:
这是因为编译器必须猜测它应该把哪些(通常是动态的)资源添加到最终的工件中,尽管代码中没有直接引用它们。
众所周知,Spring在很大程度上是基于反射机制的,因此需要将其精确地适应于GraalVM,这个过程耗费了近三年时间。
另外一项新功能:
为 Spring Integration 组件的观察模式提供配置属性:
Spring Integration 可以根据@EnableIntegrationManagement.observationPatterns值检测其组件
- 公开 spring.integration.management.observation-patterns 配置属性
- 将此属性传播到 IntegrationAutoConfiguration.IntegrationManagementConfiguration 的 @EnableIntegrationManagement 中
- 通过 IntegrationAutoConfigurationTests.integrationManagementInstrumentedWithObservation()验证该属性是否有作用。
更多修复
SpringBoot3构建演示
通过Spring Initialzr新建工程,使用最新版本的Spring Boot 3.0.0-SNAPSHOT,勾选GraalVM Native Support,新建工程后添加TestController:
@RestController |
直接运行程序,发现启动时间大约需要1秒。
下面使用Graal生成本机原生镜像:
执行生成镜像文件的命令:
./gradlew nativeCompile
这个AOT过程比较耗时,大概2分钟。
执行命令:
./build/native/nativeCompile/demo2
启动时间是 0.082 秒,快了 10 倍多。
如果你使用maven,使用如下命令:
- mvnw -Pnative native:compile
- ./target/demo2
SpringBoot3构建案例: