Skip to main content

Command Palette

Search for a command to run...

Spring Framework 6.0介绍

Published
Spring Framework 6.0介绍

在2022年5月26-27日的Spring I/O大会上,Spring框架的主要作者Juergen Hoeller对Spring Framework 6.0版本进行了总体介绍,本文为演讲的PPT的翻译。

1、发布日期

image.png

image.png

Spring Framework 6.0正式版发布日期预计是2022年11月份,此时JDK的版本应该是19。

早期尝鲜者,现在就可以去尝试了,现在最新的版本是Spring Framework 6.0-M4。

2、主要特性

image.png

  • JDK 17+
  • Jakarta EE 9+(Jakarta命名空间)
  • 可观查性(Micrometer)
  • AOT(Ahead-Of-TIme)
  • Java平台模块系统
  • 虚拟线程

3、AOT

image.png

通过编译时预处理获得更精简的部署单元

  • Spring 5:使用spring-context-indexer进行预计算类路径扫描
  • Spring 6:编译时自查整个应用的配置
  • 将声明式的Bean定义变成编程式的来源
  • 为反射、资源、序列化和代理提供运行时提示(Runtime hints)

  • 灵活且可定制,适用于众多Spring 启动场景

image.png

使用AOT还是不使用AOT

  • 减少生产中的启动时间
  • 减少生产中的内存占用
  • 使用“AOT”设置进行测试以保持与生产环境保持一致
  • GraalVM 原生可执行文件的前提条件

  • AOT 是一种权衡取舍:额外的构建设置和较低的运行时灵活性

image.png

为优化的JVM部署

  • AOT预处理在很多场景下都有用
  • 重要的是:优化现代的虚拟机部署
  • 以稍长的构建时间换取改进的启动时间
  • 可与其他虚拟机启动改进相结合

为HotSpot JVM准备更短的启动时间

image.png 为GraalVM原生可执行文件

  • GraalVM 是原生可执行文件的事实标准
  • 强大的“封闭世界假定”(当前不是已知的事物都为假的假定),无运行时适应
  • AOT处理的应用作为输入->原生可执行文件作为输出
  • 为原生代码生成需花费很长的编译时间

  • 具有强大优势和局限性的不同部署模式

image.png 为OpenJDK静态镜像(Project Leyden)

  • 展望未来,OpenJDK的目标是引入静态镜像
  • 为特定应用定制基于特定HotSpot运行时镜像
  • 渐进式方法:较弱的约束->更强的运行时灵活性
  • 严格的“封闭世界限制”作为终极目标

  • Spring的AOT策略和Leyden的虚拟机策略一致

4、Java平台模块系统

image.png

支持应用作为显式的模块构建

  • 当前:Spring 5的jar声明为自动模块
  • Spring应用选择模块路径而不是类路径
  • 应用自带“module-info.java”声明

image.png

框架模块的传递性解析

  • 当前:定义明确的模块名称,但没有依赖声明
  • Spring 6计划:带有module-info的jar,需要传递模块
  • 在应用级别模块声明中方便使用

image.png

框架模块 vs jlink镜像

  • jlink命令行工具用来编译自定义运行时镜像
  • 需要模块声明module-info
  • 自动模块仍然可以以jar包的形式部署在镜像上
  • Spring 6:可能在jlink镜像中纳入框架模块

  • 建议:保持将框架模块部署为jar

image.png

重新设计以最小化jlink镜像的占用

  • Spring 5 需要相当大的带有 JDK 模块的 jink 基础镜像
  • 主要是由于包含 java.beans 的 java.desktop 模块
  • 可能重新设计JavaBean的自查功能
  • 避免来自java.beans包的API类型和实现

  • 还没有决定:为了有限的利益而影响兼容性?

image.png

类路径扫描 vs 模块路径扫描

  • Spring 5 即使在模块里也是使用传统的类路径扫描
  • 模块内容的不完整视图。如:带有补丁的模块
  • Spring 6:通过JDK的ModuleReader API来进行模块路径扫描
  • 与常见构建方法的兼容。如:Maven Surefire

  • 在模块环境中自动适配

5、虚拟线程

image.png

“Project Loom”将在JDK 19中进入预览

  • JDK 19最终包括Project Loom作为常规预览版
  • 虚拟线程是JVM里的轻量级线程模型
  • 命令式编程的不同规模的可伸缩性
  • 实现为 java.lang.Thread 的虚拟变体

  • 在I/O操作中不阻塞操作系统线程

image.png

与“Project Loom”兼容的基础设施

  • JDK文件访问和网络库隐式释放载体线程
  • 同步块中的 I/O 操作不会释放载体线程
  • 重新审视HTTP引擎和JDBC驱动的实现
  • 虚拟线程并不意味着被池化,而是为每个任务新创建的线程

  • 我们期望在生态系统中为“Project Loom”兼容性做出努力

image.png

针对web应用

  • 早期的Loom实验已经使用web容器进行工作
  • Servlet的回调方法基于InputStream/OutputStream
  • Tomcat/Jetty执行器设置用来分发到请求处理
  • 希望在应用程序代码库中几乎没有任何必要的变化

  • 数据库驱动的 Web 应用程序有望获得显著的可伸缩性的优势

image.png

针对消息/计划任务

Spring管理的任务执行器/计划器都有虚拟线程选项

  • 如:JMS消息监听容器
  • 如:@Schedule处理方法
  • 很多监听器/处理程序触发I/O操作

  • 注意:对于纯粹的CPU绑定的处理程序来说,完全没有预期的好处。

image.png

6、修订的 Web 应用程序基础设施

几个长期计划的6.0特性

  • 基于@HttpExchange服务接口的Http接口客户端
  • 支持RFC 7807问题细节
  • 统一的HTTP状态码处理
  • 修改了WebFlux上传文件处理部分
  • JDK HttpClient 与 WebClient 的集成

More from this blog

用Java 17的Records加速Spring Boot开发

在《Spring Boot 2.6新特性:使用Java 17的Record作为配置属性》,我们提到了使用Java Records来作为Spring Boot的配置属性(configuration properties),从而减少了大量样板代码的编写,我们本篇将进一步拓展Records在Spring Boot下的应用场景,从而进一步减少我们的样板代码,使代码看上去更简洁清晰。 1、什么是Records record是一种特殊类型的类声明,目的是为了减少样板代码。record引入的主要目的是快速创...

Nov 11, 2022
用Java 17的Records加速Spring Boot开发

Spring Boot 2.6新特性:使用Java 17的Record作为配置属性

Spring Boot 3.0的基线版本是Java 17,Spring Boot 3.0版本将全面对Java 17的支持。较新版本的2.x的Spring Boot版本也可以使用Java 17的特性。 本文介绍Spring Boot 2.6对Java 17支持的一个新特性,使用Java 17的Record来做为Spring Boot的配置属性(ConfiguartionProperties)。 什么是Record record是一种特殊类型的类声明,目的是为了减少样板代码。record引入的主要目...

Nov 3, 2022
Spring Boot 2.6新特性:使用Java 17的Record作为配置属性

使用Gradle全面加速Spring Boot开发

大家都知道Gradle和Maven一样,是一个项目的构建工具。它通过任务来控制开发的进程,这些任务包括:编译、打包、测试、部署和发布等。Gradle诞生于2008年,仅仅比Maven晚4年。Android也采用Gradle作为默认的构建工具。 本文期望通过以下的讲述,帮助你快速轻松的使用Gradle加速您的Spring Boot开发应用。 1、Gradle越来越流行 2012年开始,Spring框架已全部使用Gradle来构建;2020年开始,Spring Boot也全部采用Gradle来构建...

Oct 31, 2022
使用Gradle全面加速Spring Boot开发

Spring/Spring Boot下如何动态配置计划任务

在Spring/Spring Boot下实现计划任务是很简单的,我们只需通过@EnableScheduling 开启计划任务的支持,然后通过@Scheduled 注解来制定计划任务,这样的实现解决了我们对计划任务的绝大部分需求。 但在很多时候,通过上述方式实现的计划任务是在代码里写死的,我们需要修改计划任务只能通过修改代码的方式实现。很多时候,我们需要从外部来设置计划任务执行的时间和方式。所以在本文中,我们着重讲解一下如何动态地配置计划任务。 和Spring对异步任务的支持一样,通过@Enabl...

Oct 29, 2022
Spring/Spring Boot下如何动态配置计划任务

Spring 6/Spring Boot 3新特性:优雅的业务异常处理

当你使用Spring Boot(Spring MVC)进行RESTful API开发的时候,你会发现HTTP的状态码很多时候不能足够有效的传递错误的信息。 HTTP里有一个RFC 7807规范:https://www.rfc-editor.org/rfc/rfc7807。这个规范里定义了HTTP API的“问题细节”(Problem Details)内容。 该规范定义了一个“问题细节”(Problem Details),用它来携带HTTP错误返回信息,避免自定义新的错误返回格式。我们通常情况下是...

Oct 28, 2022
Spring 6/Spring Boot 3新特性:优雅的业务异常处理

汪云飞的工具箱

24 posts