Spring6 正式发布!重磅更新,是否可以拯救 Java

news2024/12/23 3:29:58

简介

Spring Framework6 和 Spring Boot3 是一个跨越式的升级整个框架支持的最低 JDK 版本直接跨越到 JDK17,无论框架层还是基础设施层都做了巨大的改变,Spring 6.0 新框架具体做了哪些功能的升级与改进,是否有必要升级与使用呢?可以继续看一看。

下面可以先看下翻译自 Spring 官方社区一个宣导博客

尊敬的 Spring 社区:我很高兴地宣布,现在 MavenCentral 已经可以提供 SpringFramework6.0.0 了!这是 2023 年及以后新一代框架的开始,包括 OpenJDK 和 Java 生态系统中当前和未来的创新。同时,我们将其精心设计为从 Spring Framework 5.3.x 直接升级到现代运行时环境。作为核心框架的一个主要修订,Spring framework 6.0 附带了 Java 17+基线和 Jakarta EE 9+(在 Jakarta 命名空间中),重点是最近发布的 Jakarta EE10 API,如 Servlet 6.0 和 JPA 3.1。这提供了对最新 web 容器(如 Tomcat 10.1)和最新持久性提供程序(如 Hibernate ORM 6.1)的访问。不要拘泥于 JavaEE8,跳到 jakarta 命名空间,最好直接跳到 JakartaEE10 级别!即将发布的 SpringBoot3.0.0 版本为您提供了相应的托管依赖项。基础架构方面,6.0 为提前转换和相应的 AOT 处理支持 Spring 应用程序上下文提供了基础。这使得 Spring Boot 3 能够为 GraalVM 本地映像提供一流的支持。您还可以探索 Project Loom 的虚拟线程和 Spring 应用程序-请参阅“拥抱虚拟线程”-并深入了解 Project CRaC 的检查点恢复方法,以加快 JVM 启动速度,这两个功能目前都在预览中,但预计将成为基于 SpringFramework6.x 的应用程序的一流功能。Spring Framework 6.0 中还有许多其他特性和改进,例如 HTTP 接口客户端、对 RFC 7807 问题细节的支持,以及 HTTP 客户端基于千分尺的可观察性。请查看我们的“新增内容”页面,了解全面概述,并尽早尝试 6.0.0!2022 年 11 月 16 日 Cheers,Juergen

如果对原文感兴趣也可以直接访问官方原文spring.io/blog/2022/1…

通过官方宣导内容可以看到 Spring 做了很多基础设施方面的改进:

  • 支持 Java 17+基线和 Jakarta EE 9+

  • 对新一代容器 Tomcat 10.1 的支持

  • 为 GraalVM 本地映像提供一流的支持

  • 拥抱虚拟线程

  • 其他功能优化等等

对于主要用于 CRUD 的我们可能仅仅因为这些功能的改变还不值得我们全面升级。下面就整体从 Spring 支持的历史版本来看下。

更新记录

支持的版本

  • 6.0.x 是截至 2022 年 11 月的当前功能分支和主要生产线。新一代需要 JDK 17 基线。

  • 5.3.x 是第五代的最终功能分支,也是最新的生产线(截至 2020 年 10 月的 GA),在 JDK 8、JDK 11 和 JDK 17 上提供了长期支持。

  • 5.2.x 是之前的生产线(截至 2019 年 9 月的 GA),将得到积极支持,直至 2021 年底。

  • 5.1.x 和 5.0.x 不再受到积极支持,截至 2020 年 12 月已被 5.2.x 和 5.3.x 取代。

  • 4.3.x 于 2020 年 12 月 31 日达到了正式的 EOL(寿命终止)。该线路没有计划进一步的维护和安全补丁。

  • 3.2.x 于 2016 年 12 月 31 日达到其正式 EOL(使用寿命终止)。该线路未计划进一步的维护和安全补丁。

此时,官方建议尽可能从 MavenCentral 升级到最新的 SpringFramework6.0.x 版本。

相关 JDK 版本范围

根据官方文档的说明 Spring 与 JDK 的兼容版本如下列表所示:

  • Spring Framework 6.0.x: JDK 17-21 (expected)

  • Spring Framework 5.3.x: JDK 8-19 (expected)

  • Spring Framework 5.2.x: JDK 8-15

  • Spring Framework 5.1.x: JDK 8-12

  • Spring Framework 5.0.x: JDK 8-10

  • Spring Framework 4.3.x: JDK 6-8

可以看到 5.3.x 及以下的版本都是兼容 JDK8 的, 如果短期内还没有完全计划升级 JDK17 可以使用 5.3.x 的版本不仅仅兼容 JDK8 也会兼容 11 和 17 这两个稳定版本。

Spring Framework 6.x 的新增了哪些功能?

有了历史背景接下来直接进去主题,Spring Framework 6.x 的新增了哪些功能?

JDK 17+和 Jakarta EE 9+基线

  • 整个框架代码库基于 Java17 源代码级别的,已经开始不支持 JDK8 了,如果未来继续用 Spring 这个早晚得升级。

  • Servlet、JPA 等从 javax 迁移到 jakarta 命名空间。

  • 与 jakarta EE 9 以及 jakarta EE 10 API 的运行时兼容性。

  • 与最新的 web 服务器兼容:Tomcat 10.1、Jetty 11、Undertow 2.3。

  • 与虚拟线程的早期兼容性(在 JDK 19 的预览版中)。

核心修订

  • 升级至 ASM 9.4 和 Kotlin 1.7。

  • 完成 CGLIB 分叉,支持捕获 CGLIB 生成的类。

  • AOT 的全面基础。

  • 对 GraalVM 本机映像的一流支持(请参阅相关的 SpringBoot3 博客文章)。

核心容器

  • 默认情况下,没有 java.beans.Invector 的基本 bean 属性确定。

  • GenericApplicationContext 中的 AOT 处理支持(refreshForAotProcessing)。

  • 基于预解析构造函数和工厂方法的 Bean 定义转换。

  • 支持 AOP 代理和配置类的早期代理类确定。

  • PathMatchingResourcePatternResolver 使用 NIO 和模块路径 API 进行扫描,分别支持 GraalVM 本地映像和 Java 模块路径中的类路径扫描。

  • DefaultFormattingConversionService 支持基于 ISO 的默认 java.time 类型解析。

数据访问和事务

  • 支持预先确定 JPA 管理的类型(用于包含在 AOT 处理中)。

  • JPA 支持 Hibernate ORM 6.1(保持与 Hibernate ORM5.6 的兼容性)。

  • 升级至 R2DBC 1.0(包括 R2DBC 事务定义)。

  • 拆除 JCA CCI 支架。

Spring 消息

  • 基于 @RSocketExchange 服务接口的 RSocket 接口客户端。

  • 基于 Netty 5 αlpha 的反应模式的早期支持。

  • 支持 Jakarta WebSocket 2.1 及其标准 WebSocket 协议升级机制。

常规 Web 修订

  • 基于 @HttpExchange 服务接口的 HTTP 接口客户端。

  • 支持 RFC 7807 问题详细信息。

  • 统一的 HTTP 状态代码处理。

  • 支持 Jackson 2.14。

  • 与 Servlet 6.0 保持一致(同时保持与 Servlet 5.0 的运行时兼容性)。

Spring MVC

  • 默认情况下使用的 PathPatternParser(具有选择 PathMatcher 的功能)。

  • 删除过时的文件和 FreeMarker JSP 支持。

Spring WebFlux

  • 新的 PartEvent API 用于流式传输多部分表单上传(在客户端和服务器上)。

  • 新建 ResponseEntityExceptionHandler 以自定义 WebFlux 异常并呈现 RFC 7807 错误响应。

  • 非流媒体类型的通量返回值(写入前不再收集到列表)。

  • 基于 Netty 5 的反应模式的早期支持。

  • JDK HttpClient 与 WebClient 集成。

可观察性

  • 在 Spring 框架的几个部分中使用 micrometer 观测的可观测性仪器。springweb 模块现在需要 io.micrometer:micrometer observation:1.10+作为编译依赖项。

  • RestTemplate 和 WebClient 被检测以生成 HTTP 客户端请求观察结果。

  • 可以使用新的 org.springframework.web.filter.ServerHttpObservationFilter 为 HTTP 服务器观测检测 Spring MVC。

  • 可以使用新的 org.springframework.web.filter.active.ServerHttpObservationFilter 为 HTTP 服务器观测检测 SpringWebFlux。

  • 与控制器方法的 Flux 和 Mono 返回值的 micrometer 上下文传播集成。

测试

  • 支持在 JVM 上或 GraalVM 本机映像中测试 AOT 处理的应用程序上下文。

  • 与 HtmlUnit 2.64+请求参数处理集成。

  • Servlet 模拟(MockHttpServletRequest、MockHttpSession)现在基于 Servlet API 6.0。

总结

整体来看 Spring6 做了很多升级,接下来就总结几个比较重要的点:

JDK17

最低 JDK 支持版本改为 JDK17,可能大家用惯了 JDK8,这个免费又稳定支持的版本,其实 JDK 社区已经发布了支持 G1 垃圾回收器的稳定版本 JDK11,JDK11 就像是一个过渡版本一样,和 JDK8 社区提供支持的时间差不多,另外升级 JDK11 又需要做大量的兼容性测试才能正式使用,倒不如直接使用 JDK17 来的痛快。

关于 JDK17 的相关文档如下:

下载地址:www.oracle.com/java/techno…

文档地址:docs.oracle.com/en/java/jav…

迁移指南:docs.oracle.com/en/java/jav…

JDK17 引入了 ZGC,在 GC 延迟方面,JDK 17 的提升更为明显。根据网上有人压测的数据,在 Parallel 中 JDK 17 对比 JDK 8 和 JDK 11 提升 40%;在 G1 中,JDK 11 对比 JDK 8 提升 26%,**JDK 17 对比 JDK 8 提升接近 60%!**ZGC 中 JDK 17 对比 JDK 11 提升超过 40%。如果对 GC 延迟有更高的要求的用户可以考虑尽早体验 JDK17。

JDK 17 是一个 Oracle 官宣可以免费商用的 LTS 版本,所谓 LTS,是 Long Term Support,也就是官方保证会长期支持的版本,根据官方数据最多可以支持到 2029 年 9 月份。

AOT

可能很多人听说过 JIT,第一次听说 AOT 这个名词,下面就来解释一下:

这两种编译方式的主要区别在于是否在“运行时”进行编译,JIT,即 Just-in-time,动态(即时)编译,边运行边编译;

AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式。

有两种编译 Java 应用程序的方法:使用即时编译 (JIT) 或提前编译 (AOT)。第一种是默认模式,Java Hotspot 虚拟机使用它在运行时将字节码转换为机器码。后者由新颖的 GraalVM 编译器支持,并允许在构建时将字节码直接静态编译为机器码。

JIT (Just-In-Time - 实时编译)

在程序运行时,根据算法计算出热点代码,然后进行 JIT 实时编译,这种方式吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能触发 JIT 的分层机制。JIT 缺点就是编译需要占用运行时资源,会导致进程卡顿。

AOT (Ahead-Of-Time - 预先编译)

AOT 编译能直接将源代码转化为机器码,内存占用低,启动速度快,可以无需 runtime 运行,直接将 runtime 静态链接至最终的程序中,但是无运行时性能加成,不能根据程序运行情况做进一步的优化,AOT 缺点就是在程序运行前编译会使程序安装的时间增加。

现在正处于云原生,降本增效的时代,Java 相比于 Go、Rust 等其他编程语言非常大的弊端就是启动编译和启动进程非常慢,这对于根据实时计算资源,弹性扩缩容的云原生技术相冲突,Spring6 借助 AOT 技术在运行时内存占用低,启动速度快,逐渐的来满足 Java 在云原生时代的需求,对于大规模使用 Java 应用的商业公司可以考虑尽早调研使用 JDK17,通过云原生技术为公司实现降本增效。

关于 AOT 再简单介绍一下 Native Image 这个名词

Native Image 是一项创新技术,可将 Java 代码编译成独立的本机可执行文件或本机共享库。在构建本机可执行文件期间处理的 Java 字节码包括所有应用程序类、依赖项、第三方依赖库和任何所需的 JDK 类。生成的自包含本机可执行文件特定于不需要 JVM 的每个单独的操作系统和机器体系结构。

Graalvm

前面说到了 Spring6 支持的 AOT 技术,这个 Graalvm 就是底层的支持,Spring 也对 GraalVM 本机映像提供了一流的支持。

GraalVM 是一种高性能 JDK,旨在加速用 Java 和其他 JVM 语言编写的应用程序的执行,同时还为 JavaScript、Python 和许多其他流行语言提供运行时。 GraalVM 提供两种运行 Java 应用程序的方法:在 HotSpot JVM 上使用 Graal 即时 (JIT) 编译器或作为提前 (AOT) 编译的本机可执行文件。 GraalVM 的多语言能力使得在单个应用程序中混合多种编程语言成为可能,同时消除了外语调用成本。

GraalVM 向 HotSpot Java 虚拟机添加了一个用 Java 编写的高级即时 (JIT) 优化编译器。

Graalvm 架构如下图所示:

GraalVM 具有以下特性:

  • 高性能应用 Graal,一种高级优化编译器,它生成更快、更精简的代码,需要更少的计算资源

  • AOT 本机图像编译提前将 Java 应用程序编译为本机二进制文件,立即启动,无需预热即可实现最高性能

  • Polyglot 编程在单个应用程序中利用流行语言的最佳功能和库,无需额外开销

  • 高级工具在 Java 和多种语言中调试、监视、分析和优化资源消耗

总的来说对云原生的要求不算高短期内可以继续使用 2.7.X 的版本和 JDK8,不过 Spring 官方已经对 Spring6 进行了正式版发布,后续有足够精力支持的时候可以尝试在 Spring6 和 JDK17 上进行项目验证尽早升级到这些版本上进行试点比较好。

如果对此文感兴趣可以关注微信公众号 《中间件源码》 交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html网页制作期末大作业成品:基于HTML+CSS+JavaScript简洁汽车网站(7页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

「Redis」07 持久化操作(RDB、AOF)

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程 Redis——持久化操作(RDB、AOF) 1. RDB(Redis DataBase) 概述 RDB是什么 在指定的时间间隔内将内存中的数据集快照写入磁盘, 即 Snapshot 快照,恢…

实战 Creator 2.x 项目升级 3.x!避坑要点与基础 API 写法差异总结

最近,我将自己在 Cocos Store 上的一个 2D 项目《球球要回家》从 Creator 2.2.2 升级到 Creator 3.6.2,编程语言也从 JavaScript 全面升级至 TypeScript 并适配微信小游戏,目前在微信审核中!本篇文章就来跟大家分享一下&#xff0…

发布3天获推荐10w+,视频号内容出现新玩法?

上月,腾讯发布Q3季度财报,视频号也被重点提及,广告主对其早前上线的原生信息流广告需求强劲,像首批投放的阿玛尼等品牌的广告还曾引起过不少讨论。用户对视频号广告的关注热度高,也从侧面说明,视频号目前的…

大数据流批一体

流批一体的内涵 流批一体中的“流批”是指流处理与批处理,是两种不同的数据处理方式,而不是对数据种类的划分。具体来说,数据可以按产生的时间划分为历史数据与实时数据,亦可按数据的明细程度分为流水数据与切片数据;数…

VS2022环境下C++ DLL动态链接库的编写和调用

一、编写DLL动态链接库 1、新建动态链接库项目 2、新建类 3、宏定义 #ifdef DLL_API # define DLL_API _declspec(dllexport) # else # define DLL_API _declspec(dllimport) #endif 4、使用宏定义修饰类 /*h*/ #pragma once#ifdef DLL_API # define DLL_API _declspec(dl…

ad2019--LED灯按键类创建元件库

摘自凡亿教育 一、LED灯按键类创建元件库 1.绘制LED灯的原理图库 鼠标右击箭头所指的,然后选择倒数第三个,多边形 在画的时候可以按住,shift空格,来调整角度。 但是,一般的LED灯都是蓝色的,我们可以把它…

用MybatisPlus代码生成器生成代码

作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注&…

用帝国主义竞争算法(ICA)求解旅行商问题(TSP)(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

两大产品上线“粤复用”,赋能大数据智能行业发展

为深入贯彻落实国家《关于加强数字政府建设的指导意见》关于数字政府应用“一地创新、各地复用”的部署要求,促进优秀应用成果快速、可靠、低成本地复用推广,正式上线广东数字政府应用超市——“粤复用”。据悉,“粤复用”应用超市汇聚各级政…

spring-aop源码分析(2)_AnnotationAwareAspectJAutoProxyCreator后置处理器

本文将通过阅读AnnotationAwareAspectJAutoProxyCreator后置处理器的源码,分析其解析AOP通知、匹配切入点和创建AOP代理的流程。 入口 AnnotationAwareAspectJAutoProxyCreator是一个BeanPostProcessor实现,他在容器进行initializeBean的时候被调用&am…

[附源码]计算机毕业设计汽车美容店管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

TDH社区版上新宽表数据库Hyperbase,轻松实现海量数据的毫秒级精确检索

日前,为了降低用户接触使用大数据技术的门槛以及成本,星环科技推出TDH社区版(Transwarp Data Hub Community Edition)来帮助企业用户、高校师生、科研机构以及其他专业开发人更简单、更便捷的进行大数据分析。为了满足更多用户在存…

IT统一运维软件发展趋势浅析

在企业IT数字化转型趋势下,为支撑业务敏捷、稳定、创新发展,IT运维的重要性已日益凸显。伴随着IT运维管理目标、管理范围、管理对象及管理深度的转变,IT运维平台建设呈现管理一体化、规模扩大化、业务可视化、运维自动化、运维智能化的关键趋…

成功实施企业内容管理(ECM)的 5 个技巧

成功实施企业内容管理(ECM)的 5 个技巧 俗话说,唯一不变的就是变化。在您不懈努力发展业务的过程中,您需要改变业务流程、不断升级产品、使用技术实现自动化、让您的员工和客户满意。 改变管理方式是实施企业内容管理的一个关键考…

Vue Element UI 中 el-table 树形数据 tree-props 多层级使用避坑

实现效果: element官网提示设置tree-props为{children: ‘children’,hasChildren: ‘hasChildren’},data数据需要设置children和hasChildren属性,row-key也绑定了数据的唯一值变量id,但是树形结构的第三级就是出不来 如图 可以…

02、交换机

目录 1.、Exchange(交换机)的作用 2、Exchange(交换机)的类型 2.1.直连交换机:Direct Exchange 2.2.主题交换机:Topic Exchange 2.3.扇形交换机:Fanout Exchange 2.4.首部交换机:Headers exchange 2.5.默认交换机 2.6.Dead…

MySQL基础三问:底层逻辑、正在执行、日志观察

背景及目录: 经常面试会遇到且实际工作中也会应用到的三个场景: 一.mysql查询时的底层原理是什么? 二.如何查看正在执行的mysql语句? 三.如何观察mysql运行过程中的日志信息? - - - - - - - - - -分割线- - - - -…

【html5期末大作业】基于HTML+CSS+JavaScript管理系统页面模板

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

pyinstaller 操作以及常见问题解决

最近有需要用pyinstaller打包 直接上命令: pyinstaller -F xxx.py -w -i img.ico-F 指定需要打包的主文件,-w是让打包后的exe,运行不再出现cmd框,一般打包都会加上,-i 是指定打包后的图标ico文件 在线生成ico链接&am…