Spring Framework 6正式发布,携JDK 17Jakarta EE开启新篇章

news2024/11/27 12:53:54

在这里插入图片描述

本文已被https://yourbatman.cn收录;女娲Knife-Initializr工程可公开访问啦;程序员专用网盘https://wangpan.yourbatman.cn;技术专栏源代码大本营:https://github.com/yourbatman/tech-column-learning;公号后台回复“专栏列表”获取全部小而美的原创技术专栏

你好,我是YourBatman:一个俗人,贪财好色。

TitleLink
所属专栏[YourBatman]-资讯/新特性,[YourBatman]-Spring技术栈新特性
源代码https://github.com/yourbatman/FXP-java-ee
程序员专用网盘公益上线啦,注册送1G超小容量,帮你实践做减法https://wangpan.yourbatman.cn
Java开发软件包(Mac)https://wangpan.yourbatman.cn/s/rEH0 提取码:javakit
女娲工程http://152.136.106.14:8761
版本约定[Mac OS 13.0.1],[IDEA 2022.2.4]

📚前言

在云原生发展势头下,Spring被冠以太重的标签,被新兴框架QuarkusMicronaut等嘲笑“廉颇老矣”。可亲是否可知,最初Spring就是以轻量级出圈(interface 21就是佐证),横扫Java EE。

笔者在年初的文章早有“预告”,Spring团队2022年会有大动作。从年初到年底,可谓千呼万唤始出来:Sprng Framework 6终于GA(同时期的还有Spring Boot和Spring Cloud在前后脚都会发布RELEASE版本)。

Sprng Framework 5于2017年9月份发布,距今已有5年多了。作为Spring技术栈的底座:本次Spring Framework大版本号升级是阻断式的,不向下兼容

值得注意的是,本文并不尝试解释Spring Framework为何一跃将JDK的baseline从JDK 8提到JDK 17,以及废弃javax启用全新的jakarta命名空间,那是另一个系列的话题了。本文仅尝试介绍新特性

🌈what’s new(新特性)

老规矩,将我们关心的功能爽一遍。

🚀最低要求JDK 17

Spring Framework 6基于JDK 17构建。换句话讲,若想使用Spring Framework 6那么你的JDK环境最低要求JDK 17。市占率方面目前JDK 8其实已跌落至第二,曾经的“你发任你发,我用Java 8”终将成为历史,这不Spring这次就来引领潮流。

问:同为LTS版本的JDK,Spring团队为何没选择受众更多的JDK 11而一跃选择了更高版本的JDK 17呢?不怕栽跟头吗?

现在我创建一个Spring Framework 6的项目(基于maven构建):
在这里插入图片描述
点确定后,加入依赖:
在这里插入图片描述
启动Spring容器的代码:

/**
 * 在此处添加备注信息
 *
 * @author YourBatman
 * @since 0.0.1
 */
@ComponentScan
public class Application {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
        System.out.println(context.getBean(DemoConfiguration.class));
    }

}

成功运行程序!

当然若你不信邪,执意用JDK 8运行这段程序,那么你得到的将是这个:
在这里插入图片描述

🚀从Java EE迈向Jakarta EE

javax命名空间其实早已成为过去式,毕竟现在已快2023年了。这次Spring团队也是跟着JDK一起,顺势的完全摒弃掉了javax命名空间,拥抱Jakarta EE。

Jakarta EE估摸不少读者可能没听过,没关系!关于Java EE和Jakarta EE的“恩怨情仇(历史渊源)”,感兴趣的一定要看看笔者的这个系列:[YourBatman]-Java EE,给你说得门清。

从Jakarta EE 9开始,便使用了全新的jakarta.*命名空间。本次建议使用从Jakarta EE 10起步。对应的技术主要有:

  • Jakarta Servlet 6.0
  • Jakarta Servlet JSP JSTL 3.0
  • Jakarta Validation 3.0
  • Jakarta WebSocket 2.1
  • Jakarta Persistence 3.1
  • Jakarta JMS 3.1
  • Jakarta JSON 2.1
  • Jakarta JSON Bind 3.0
  • Jakarta Activation 2.1
  • Jakarta Mail 2.1
  • Jakarta Transaction 2.0
  • Jakarta WS RS 3.1
  • Jakarta XML SOAP 3.0
  • Jakarta XML WS 4.0

另外,之前有些内置进JDK里面的Java EE注解,现在也换“包名”啦,如具有代表性的:JSR-330的@Inject、JSR 250的@PostConstruct@Predestroy以及及其常用的@Resource注解。
在这里插入图片描述
在这里插入图片描述

🚀LocalVariableTableParameterNameDiscoverer标记为过时

LocalVariableTableParameterNameDiscoverer是ParameterNameDiscoverer的一个实现类,用于找出参数名。它是Spring的一个经典实现,早在Spring Framework 2.0就已出现。我们知道java代码编译后,默认情况下参数名是不会保留的,而它利用了LocalVariableTable + ASM字节码技术实现了参数名的查找。

直到Spring Framework 4.0(此版本开始支持JDK 8),才出现了它的替代者:StandardReflectionParameterNameDiscoverer,基于JDK 8标准的参数化实现的。

JDK支持编译时加上"-parameters参数,便可保留方法参数的名字

一直以来,Spring Framework为了考虑兼容性只能降低LocalVariableTableParameterNameDiscoverer的优先级但并“不敢”打干掉它的注意。这次显然不一样勒,已经标记为过时了:
在这里插入图片描述
按照Spring OSS标准,标记为过时的类,在下个中型版本将会被移除。为此,Spring为了防止“乱用”,如若在运行过程中发现你使用到了此类,会收到如下warn警告:

Using deprecated '-debug' fallback for parameter name resolution. Compile the 
affected code with '-parameters' instead or avoid its introspection: 处理的类的全类名

这是一个优秀框架该有的样子:完成了太多的非功能性需求,可谓想犯错都难。

🚀ListenableFuture被标记为过时

JDK最初有Futrue,而后Spring搞了一个增强版的ListenableFuture。直到Java 8的出现:有了CompletableFuture再也不用使用ListenableFuture了。这不,这次顺势就把它拿下了。
在这里插入图片描述
除了ListenableFuture本身,与其相关的类都已被标记为过时,如:ListenableFutureCallback、SuccessCallback、FailureCallback等。

🚀移除调CommonsMultipart等类

一直以来spring-web支持两种上传文件方式:

  1. 基于Apache Commons Fileuplod库的CommonsMultipartResolver的解决方案
  2. 基于标准Servlet规范的StandardServletMultipartResolver解决方案

对应的就是MultipartResolver接口的两个实现类,如下图所示(6之前的版本有两个实现):
在这里插入图片描述
从本版本(Spring Framework 6)起,基于Apache Commons实现方案正式退出历史舞台,相关类也已从源代码里删除。自此MultipartResolver有且仅有唯一实现:
在这里插入图片描述
值得一提的是:起初Spring框架上传文件推荐选择的是基于Apache Commons库的方案(也就是CommonsMultipartResolver),因为那会基于Servlet的方案性能有较大问题;但随着Servlet的更新(从Servlet 3.0开始,javax.servlet.http.Part技术出现就不再有性能问题了),问题得到解决。

🚀HttpMethod不再是枚举,改为了类

HttpMethod是web开发中比较常见的一个类,本次从enum -> class类型的变更绝大部分情况下都能兼容,只在某些特殊case下注意一下即可(比如不能再使用switch而需改为if else来做分支逻辑了)。

PS:HttpMethod改为类后重写了hashcode和equals方法,因此等值==比较也是不会有问题的,请放心食用

Spring Framework 5.x版本:
在这里插入图片描述
Spring Framework 6版本:
在这里插入图片描述

🚀RestTemplate最低要求HttpClient 5.x

RestTemplate是spring-web对http请求的抽象,它底层的实现技术可以是Apache HttpClient、OkHttp、JDK实现等等,具体采用什么技术是由ClientHttpRequestFactory的实现类决定的。

本次Spring Framework 6针对Apache的实现,彻底摒弃Apache HttpClient 4.x,拥抱Apache HttpClient 5。
在这里插入图片描述
虽然底层实现有所变更,但若你代码里是面向Spring的RestTemplate进行编程的,那就可做到无感知。

🚀仅标注@RequestMapping注解不再被扫描为Controller了

喜大普奔!喜大普奔!喜大普奔!重说三,懂的都懂。

在之前的Spring Framework版本中,spring-web会将标注有@Controller注解或者标注有@RequestMapping注解的扫描为一个控制器(controller):
在这里插入图片描述
这个动作看似合理方便了使用,但这在Spring Cloud场景下非常“烦人”:@FeignClient + API Jar包是现行微服务通信的典型使用方式。

在Spring Boot大一统的包扫描背景下,多数团队@EnableFeignClients也采用大一统的扫描策略,然而这就是“灾难”的开始:非常容易得就将一个@FeignClient接口扫描为一个controller从而对外暴露了其所有接口,除了大大拖慢启动速度、造成URL冲突之外,进而产生了重大安全隐患。

PS:虽然一般的公司在脚手架层面会默默的解决掉这个问题,但据我了解绝大多数团队其实并未关注过此问题,比如笔者写过的:在这里插入图片描述

这下好了,Spring Framework 6帮我们解决了这个烦恼,这是它的判断逻辑:控制器只认@Controller注解了。
在这里插入图片描述
这让我想起来有些同学使用@Bean去声明一个控制器,现在是不行了(之前可以大概率是因为类上有@RequestMapping注解而误打误撞了),需要引起重视。

🚀GenericApplicationContext支持AOT

支持AOT是Spring拥抱Native、拥抱云原生的基础,当然这也是为何必须基于至少JDK 17构建的原因之一。

🚀对GraalVM native images提供一流的支持

GraalVM嘛,等下篇文章聊Spring Boot 3.0.0时再谈。

🚀PathMatchingResourcePatternResolver使用NIO和module方式扫描加速

Spring的scan一直是导致容器启动慢的重要愿意之一,甚至没有之一。Spring Framework 6版本对此做了很大的优化。

其实,早在Spring Framework 5就采用了index方式进行scan优化,效果还是比较显著的。但是此方式并不够100%通用且使用起来不太方便,因此没击起什么浪花(默认情况下并不会启用)。这次不一样了:将可选项变为了必选项,更是唯一选项

在此之前PathMatchingResourcePatternResolver只能通过扫xxx路径下的所有文件(同步阻塞IO)来发现Bean。多module是JDK瘦身的一种方式,这次就利用多模块 + GraalVM双重优势,来大大加快扫描的速度,核心代码在这里:
在这里插入图片描述

🚀强依赖micrometer的可观测性

在Spring Framework 6的几个(不是全部)子项目中使用micrometer进行了直接的观测性。比如:spring-web模块现在就强依赖io.micrometer:micrometer-observation来完成(编译)工作:
在这里插入图片描述
micrometer之前只被用在Spring Boot中,现在Spring Framework部分子项目也接入了,这样观察将会更直接更全面,这就是生态整合能力了吧。

✍总结

Spring Framework作为Java领域最为流行的框架(没有之一),有非常庞大的用户群体、项目历史。这些历史现在看来即是它的优势,有时也会成为较重的包袱。

Spring团队自然能感知到“危机”,故有了Spring Native项目回应“尚能饭否”。这次Spring Framework 6直接以JDK 17起底,并且对GraalVM native images提供一流支持,目的非常明确:(适当的)甩掉包袱,证明我还行。

最后分享一句话:上山的人永远不要嘲笑下山的神。况且Spring依旧如日中天~

推荐阅读

  • [YourBatman]使用IDEA的60+个快捷键分享给你,权为了提效(Git&Other&完结篇)
  • [YourBatman]使用IDEA的60+个快捷键分享给你,权为了提效(Live Template&Postfix Completion篇)
  • [YourBatman]使用IDEA的60+个快捷键分享给你,权为了提效(重构篇)
  • [YourBatman]使用IDEA的60+个快捷键分享给你,权为了提效(代码补全篇)
  • [YourBatman]使用IDEA的60+个快捷键分享给你,权为了提效(运行/调试篇)
  • [YourBatman]使用IDEA的60+个快捷键分享给你,权为了提效(视窗、选择篇)
  • [YourBatman]使用IDEA的60+个快捷键分享给你,权为了提效(导航篇)
  • [YourBatman]使用IDEA的60+个快捷键分享给你,权为了提效(操作系统、终端篇)

在这里插入图片描述

我是YourBatman:前25年不会写Hallo World、早已毕业的大龄程序员。高中时期《梦幻西游》骨灰玩家,网瘾失足、清考、延期毕业、房产中介、保险销售、送外卖…是我不可抹灭的黑标签

  • 🎓2013.07 清考、毕业答辩3次未通过、延期毕业
  • 🏷2013.08-2014.07 宁夏中介公司卖二手房1年,毕业后第1份工作
  • ️️🏷2014.07-2015.05 荆州/武汉,泰康人寿卖保险3月、饿了么送外卖2月,还有炸鸡排、直销等第2345份工作
  • 🏷2015.08 开始从事Java开发,闯过外包,呆过大厂!擅长抽象思维,任基础架构团队负责人
  • 🏷2021.08 因“双减政策”失业!历经9面,终获美团外卖L8的offer
  • 🙅🏻‍♀️Java架构师、Spring开源贡献者、CSDN博客之星年度Top 10、领域建模专家、写作大赛1/2届评委
  • 📚高质量代码、规范践行者;DDD领域驱动深度实践;即将出版书籍《Spring奇淫巧技》

在这里插入图片描述

序号专栏名称简介
01[YourBatman]-程序人生程序人生,人生程序
02[YourBatman]-资讯/新特性IDEA、JDK、Spring技术栈…新特性
03[YourBatman]-IntelliJ IDEA熟练使用IDEA就相当拥有物理外挂,助你高效编码
04[YourBatman]-Bean Validation熟练掌握数据校验,减少90%的垃圾代码
05[YourBatman]-日期时间帮你解决JDK Date、JSR 310日期/其实 的一切问题
06[YourBatman]-Spring类型转换Spring类型转换-框架设计的基石
07[YourBatman]-Spring staticstatic关键字在Spring里的应用
08[YourBatman]-Cors跨域关于跨域请求问题,本专栏足矣
09[YourBatman]-JacksonAlmost Maybe是最好的Jackson专栏
10[YourBatman]-Spring配置类专讲@Configuration配置类,你懂的
11[YourBatman]-Spring技术栈暂无所属小分类的,Spring技术栈大分类
12[YourBatman]-JDK暂无所属小分类的,JDK技术栈大分类
13[YourBatman]-ServletServlet规范、Web相关内容专题
14[YourBatman]-Java EE从Java EE到Jakarta EE,30年弹指一挥间
15[YourBatman]-工具/提效开发工具、软件工具,目标是提效
16[YourBatman]-Spring技术栈新特性 Spring Framework、Spring Boot、Spring Cloud、Spring其它技术
17[YourBatman]-基本功 每个Javaer,都需要有扎实的基本功
99源代码库大多数专栏均配有源代码,都在这里
  • 源代码库地址:https://github.com/yourbatman/tech-column-learning
  • CSDN主页:https://blog.csdn.net/f641385712
  • 掘金主页:https://juejin.cn/user/430664289367192
  • 博客园主页:https://www.cnblogs.com/yourbatman
  • 个人博客主页:https://yourbatman.cn
  • 个人网盘主页:https://wangpan.yourbatman.cn

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

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

相关文章

1.什么是闭包

什么是闭包 1. 概念 闭包(closure)指有权访问另一个函数作用域中变量的函数。—《JavaScript高级程设计》 简单理解就是一个函数。 2. 如何产生闭包? 当一个嵌套的内部函数引用了嵌套的外部函数的变量(函数)时&…

CANoe-vTESTstudio之Test Diagram编辑器(元素介绍)

Test Diagram编辑器里的工具箱,有多个图形符号,它们是组成测试图表的图形元素,具有不同的作用。图形元素能够高效并快速地创建测试图表,然后生成测试用例 1. 基本测试设计元素 基本元素用来创建图形设计 1.1 Setup Setup元素的测试代码能够执行一次,在检查测试用例之前…

特别有用!Jmeter命令行执行时设置并发数和循环次数的方法

Jmeter命令行方式运行概述 之前写过一篇文章介绍如何在centos上部署jmeter来执行性能测试,链接如下: https://blog.csdn.net/liwenxiang629/article/details/124140833 因为大多数linux服务器都是没有GUI界面的,这就需要我们通过命令行的方…

MobPush Android For Unity

集成准备 注册账号 使用MobSDK之前,需要先在MobTech官网注册开发者账号,并获取MobTech提供的AppKey和AppSecret,详情可以点击查看注册流程 下载.unitypackage包 打开 Github 下载 MobPush-For-Unity 项目,下载完成后直接双击或…

【图神经网络论文整理】(十)—— How Powerful are Graph Neural Networks?:GIN

作者信息:Keyulu Xu, Weihua Hu, Jure Leskovec, Stefanie Jegelka论文来源:Computer Vision and Pattern Recognition论文地址:https://arxiv.org/abs/1810.00826 本文介绍的论文是《How Powerful are Graph Neural Networks?》。 作者提…

MySQL表的增删查改(嘎嘎详细~

hello呀!各位,这里是Sunlightʊə。 目前大三,主要在学习Java语言。可以一起交流呀! 相关文章: MySQL数据库的基础操作(简单、基础版 专栏: Java数据结构 Java基础语法 MySQL基础 目录 新增&am…

流式 Isotype control 流式细胞仪control组

流式细胞术是非常让人着迷的实验。在众多医学研究手段里,如果说弱水三千只取一瓢的话,那我会首选流式细胞术。从我个人感受来讲,流式细胞术高速客观,具有统计学意义,能够处理复杂样本并同时获取多种参数,最最关键的是它性能可靠,可重复性非常好。 虽然也存在一些局限,…

3款超实用的电脑软件,免费又良心,内存满了也绝不卸载

超强的3款电脑软件,每款都是百里挑一的精品。 1、视频画质增强器 这是国人开发的图片视频增强工具,完全免费无任何弹屏广告,它能将画质很差的图片,一键转化为高清大图,同时还能无损放大图片,图片输出格式支…

第150篇 笔记-元宇宙(Metaverse)

定义:元宇宙是一个整体虚拟世界的概念,它与现实世界并行存在,提供主权数字所有权、独特的在线身份、互联环境和沉浸式体验。 随着最近区块链生态系统中NFT的爆炸,以及Facebook的头部转向“Meta”,元宇宙已进入主流公众…

代码源每日一题div1 枚举倍数 平方计数

平方计数 - 题目 - Daimayuan Online Judge 题意: 思路: 首先注意到暴力枚举一定超时,因此我们考虑只枚举一个指针,然后推一推式子降低另一个指针的复杂度 对于完全平方数这个条件,我们无法直接转换 即对于每一个a[…

1.3 测控电路的信号类型、测控电路的类型与组成、测控电路的发展趋势

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事硬件研发,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验&a…

技术指南 | 如何集成Perforce版本控制系统Helix Core (P4V) 与敏捷规划工具Hansoft

Helix Core是Perforce公司旗下一款集源代码管理和内容协作为一体的版本配置与管理工具,可以帮助您管理随时间推移而产生的数字资产(代码,文件等)变更,处理每天数以千万计的传输,上千TB的数据,以…

zabbix模板监控和自定义监控

目录 一、环境准备 二、使用模板监控 1、添加监控主机 2、设置应用监控模板 3、查看监控数据 三、自定义监控 1、配置自定义监控key 2、创建自定义监控模板、应用集、监控项和图形 2.1、监控模板、应用集、监控项介绍 2.2、创建监控模板 2.3、给自定义模板添加应用集…

mysql回表查询和索引覆盖

作为 JAVA 开发的必备知识,了解回表查询和索引覆盖可以大大提升数据库查询的速度,也是优化数据库查询的必备知识。 1. 什么是索引? 索引(在 MySQL 中也叫“键key”)是存储引擎快速找到记录的一种数据结构,通俗来说类…

什么是Hystrix?简述实现机制

分布式容错框架 阻⽌故障的连锁反应,实现熔断 快速失败,实现优雅降级提供实时的监控和告警资源隔离: 线程隔离,信号量隔离 线程隔离:Hystrix会给每⼀个Command分配⼀个单独的线程池,这样在进⾏单个服务调⽤…

深入react源码看setState究竟做了什么?

前言 在深究 React 的 setState 原理的时候,我们先要考虑一个问题:setState 是异步的吗? 首先以 class component 为例,请看下述代码(demo-0) class App extends React.Component {state {count: 0}hand…

LQ0272 矩形运算【计算几何】

题目来源:蓝桥杯2012初赛 Java A组H题 题目描述 在编写图形界面软件的时候,经常会遇到处理两个矩形的关系。 如图 1 所示,矩形的交集指的是:两个矩形重叠区的矩形,当然也可能不存在(参看图 2 &#xff09…

Linux下C语言UDP协议通信实践

UDP和TCP协议一样,都是传输层协议。是无连接的,不安全的,报式传输层协议,通信过程默认也是阻塞的。其通信特点主要如下: (1)不需要建立连接 ,所以不需要进行 connect () 操作 &…

国产操作系统之凝思磐石安装

一、凝思磐石操作系统简介 安全性是凝思磐石安全服务平台软件V2.4的主要特征,充分结合凝思科技独有技术与国内外多项安全标准的要求,在操作系统和应用程序的各个层次进行安全增强,使系统成为安全的有机整体。主要安全机制有以下几点&#xff…

高校房产管理现状及数图互通解决方案?

高校拥有大量的房产土地资源、公共设施、公有住房等,是高校开展各类教学、科研的基础场所,也是学校国有资产不可缺少的一部分。但是在管理过程中,存在着较多的困难与问题: 1.房地产的有效利用率不高 2.房地产管理信息化速度较慢…