Spring 6.0和SpringBoot 3.0新特性

news2024/11/27 21:04:55

目录

主要更新内容是以下几个:

AOT编译

Spring Native

GraalVM

SpringBoot3生成二进制可执行文件底层流程


  • 主要更新内容是以下几个:

    • A Java 17 baseline
    • Support for Jakarta EE 10 with an EE 9 baseline
    • Support for generating native images with GraalVM, superseding the experimental Spring Native project
    • Ahead-Of-Time transformations and the corresponding AOT processing support for Spring application contexts
  • 首先,前两个比较容易理解,主要说的是依赖的服务的版本升级的信息,那就是Spring Framework 6.0和SpringBoot 3.0都要求JDK的版本最低也得是JDK 17
  • 并且底层依赖的J2EE也迁移到了Jakarta EE 9
  • 虽然JDK 17有很多新的特性,并且也是目前最新的一个LTS版本
  • 但是其实真正的使用比较多的版本还是JDK 1.8,而Spring彻底抛弃17之前的所有版本
  • AOT编译

  • Ahead-Of-Time,即预先编译,这是相对于我们熟知的Just-In-Time(JIT,即时编译)来说的
  • 相比于JIT编译,AOT指的是在程序运行前编译,这样就可以避免在运行时的编译性能消耗和内存消耗,可以在程序运行初期就达到最高性能、也可以显著的加快程序的启动
  • AOT的引入,意味着Spring生态正式引入了提前编译技术,相比于JIT编译,AOT有助于优化Spring框架启动慢、占用内存多、以及垃圾无法被回收等问题
  • Spring Native

  • 在Spring的新版本中引入了Spring Native
  • 有了Spring Native,Spring可以不再依赖Java虚拟机,而是基于 GraalVM 将 Spring 应用程序编译成原生镜像(native image),提供了一种新的方式来部署 Spring 应用
  • 这种部署Spring的方式是云原生友好的
  • Spring Native的优点是编译出来的原生 Spring 应用可以作为一个独立的可执行文件进行部署,而不需要安装JVM,而且启动时间非常短、并且有更少的资源消耗
  • 他的缺点就是构建时长要比JVM更长一些
  • GraalVM

  • JVM的弊端
    • JVM实现了跨平台,使得一次编译即可到处运行
    • 但是詹姆斯·高斯林没有跟你说的是,应用运行之前要先启动JVM虚拟机,然后还要加载一大批的类、并做链接和初始化等步骤,而使得光启动一个JVM就得花一大把时间,JVM启动完之后才能执行应用程序本身的启动工作,比如启动Spring容器、启动Tomcat等等
    • 在一些场景下,集群需要做动态扩缩容,这个动作当然是越快越好,不可能请求过来了,花了半天时间来启动应用,等应用启动完,客户端那边都已经超时了
    • 特别像目前也比较火的FaaS,更加需要应用程序能快速的启动
  • GraalVM与Go
    • 所以近几年来,Go语言火了,Go语言是一种编译型语言,我们需要先把Go代码直接编译成为一个二进制执行文件,比如windows上的exe文件,然后直接运行exe文件就能快速启动程序
    • 如果说,十年前,Spring是Java的春天,那现在GraalVM就是Java的救世主,Java要想不被Go挤掉,整个Java生态都要向GraalVM靠齐
    • GraalVM提供了很多功能,其中一个功能就是能把Java代码直接编译成为二进制文件,比如exe文件,从而使得Java程序也能够快速启动
  • GraalVM与Docker
    • 目前,大部分Java应用应该都是运行在Docker容器中,这就需要Docker容器中也要安装JDK或JRE,但是如果利用GraalVM将Java应用编译成为了exe文件,那么我们就可以直接把exe文件打成一个Docker镜像了,从而不需要在Docker中安装JDK了,这样将使得Docker容器更加小巧,也更加适应自动扩缩容
  • GraalVM的缺点与未来
    • GraalVM为了把Java程序编译为一个可执行的二进制文件,需要预先确定程序中用到的所有类,但是Java程序中很有可能某些类是动态生成的,比如很多框架中都用到了动态代理,从而程序运行过程中会动态生成一些类
    • 为了解决这个问题,比较笨的办法是,通过配置文件指定哪些类是动态生成的,比较聪明的办法是,先运行一下程序自动找到哪些类是动态生成的
    • GraalVM这两种办法都是支持的,这样对于Spring、SpringBoot这些框架就能省事很多了
    • 这样,对于一个SpringBoot应用程序,就可以利用GraalVM将它编译成为一个可执行的二进制文件了
    • 当然,Spring及SpringBoot为了进一步提升启动速度,Spring及SpringBoot自身也做了一些优化,比如Spring AOT将Bean扫描转移到了编译期来做,从而能进一步提升启动速度
  • SpringBoot3生成二进制可执行文件底层流程

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

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

相关文章

录音转写和AI质检的区别和使用场景

区别: 录音转写是将语音或录音转化为文本形式的过程。它通常涉及使用自然语言处理技术和语音识别算法来将音频文件中的语音转换为可读的文本格式。 AI质检是一种利用人工智能技术对客户服务、销售和其他电话中心交互进行自动化评估的过程。通过分析和评估客户和代…

【C++】STL案例2-员工分组

#include <iostream> using namespace std;#include<vector> #include<map>#define CHEHUA 0 //策划部门 #define MEISHU 1 //美术部门 #define YANFA 2 //研发部门class Worker { public:string m_Name;int m_Salary; };void createWorker(vector<…

flask使用Flask-Mail实现邮件发送

Flask-Mail可以实现邮件的发送&#xff0c;并且可以和 Flask 集成&#xff0c;让我们更方便地实现此功能。 1、安装 使用pip安装&#xff1a; $ pip install Flask-Mail或下载源码安装&#xff1a; $ git clone https://github.com/mattupstate/flask-mail.git $ cd flask-…

Java线程与锁常考知识点

Java线程与锁常考知识点 基础篇1. 创建线程的几种方式2. 线程池创建的方式3. 线程池提交任务的流程4. 线程池有哪些状态 进阶篇1. 说说对线程安全的理解2. 对守护线程的理解3. ThreadLocal的底层原理4. 并发、并⾏、串⾏之间的区别5. Java死锁如何避免&#xff1f;6. 线程池的底…

滑动窗口实例8(最小覆盖子串)

题目&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t…

C/C++中FILE指针的使用总结

在C中&#xff0c;FILE指针是一个用于文件操作的指针类型。它是C语言标准库中的一部分&#xff0c;也被C所继承。通过使用FILE指针&#xff0c;我们可以打开、读取、写入和关闭文件。 在C中&#xff0c;FILE指针通常与标准库中的文件操作函数一起使用&#xff0c;例如fopen(),…

通俗易懂玩QT:QStackedWidget 学习

QStackedWidget 学习 一、介绍 业务需求&#xff0c;用到了 QStackWidget 这个类&#xff0c;然后程序存在很严重的内存泄露问题&#xff0c;所以特意研究了一下 QStackWidget 类&#xff0c;QStackWidget 类的功能是窗体切换&#xff0c;它比 QTabWidget 使用起来更为灵活&a…

【高等数学基础知识篇】——不定积分

文章目录 一、不定积分的概念与基本性质1.1 原函数与不定积分的基本概念1.2 不定积分的基本性质 二、不定积分基本公式与积分法2.1 不定积分基本公式2.2 不定积分的积分法2.2.1 换元积分法2.2.2 分部积分法 三、两类重要函数的不定积分——有理函数与三角有理函数3.1 有理函数的…

架构设计基础设施保障IaaS计算

目录 1 IaaS概述2 服务部署演进历程3 云虚拟机4 云虚拟机如何选型5 云虚拟机的创建操作6 服务部署访问 1 IaaS概述 云计算并不是一种单一类型的产品&#xff0c;而是为满足企业各种IT需求而提供的多种服务。 通过云计算提供的一类这样的服务是基础设施即服务&#xff08;IaaS&a…

蓝桥杯备赛(Day5)——二叉树

二叉树存储 普通做法&#xff0c;二叉树一个节点包括结点的数值以及指向左右子节点的指针 在class Node中 def __init__(self,s,lNone,rNone):self.valNoneself.llself.rr 在竞赛中&#xff0c;我们往往使用静态数组实现二叉树&#xff0c;定义一个大小为N的静态结构体数组…

使用iCloud和Shortcuts实现跨设备同步与自动化数据采集

在如今的数字时代&#xff0c;跨设备同步和自动化数据采集对于提高工作效率和便利性至关重要。苹果的iCloud和Shortcuts App为我们提供了强大的工具&#xff0c;可以实现跨设备同步和自动化数据采集的功能。本文将详细介绍如何利用iCloud和Shortcuts App实现这些功能&#xff0…

英诺森供应链一体化平台解析

近日&#xff0c;2023年中国物流与采购联合会科学技术奖正式公布&#xff0c;该奖项经国家科技部批准&#xff0c;在国家科学技术奖励工作办公室登记备案&#xff0c;是我国物流行业最具影响力的奖项之一。 英诺森联合客户申报的科技项目“英诺森供应链智能数据平台”&#xf…

Golang编写客户端SDK,并开源发布包到GitHub,供其他项目import使用

目录 编写客户端SDK&#xff0c;并开源发布包到GitHub1. 创建 GitHub 仓库2. 构建项目&#xff0c;编写代码Go 代码示例&#xff1a;项目目录结构展示&#xff1a; 3. 提交代码到 GitHub仓库4. 发布版本5. 现在其他人可以引用使用你的模块包了 编写客户端SDK&#xff0c;并开源…

记一次以太网连接失败修复

症状: 很久没用这个电脑了&#xff0c;开机以后&#xff0c;发现连不上校园网。 遂检查网线&#xff0c;发现网线连在自己笔记本是可以用的&#xff0c;说明网线没问题。 但是网线连在主机是红灯常亮黄灯闪烁&#xff0c;怀疑是网卡有问题&#xff08;后证明不是&#xff0c…

成都车展:比亚迪“豹力美学”杀入硬派SUV市场

在熙熙攘攘人头攒动的2023成都国际车展上&#xff0c;如果要评选一家人气最旺的车企展台&#xff0c;那必然非比亚迪莫属。 在比亚迪现场展示的多款车型中&#xff0c;作为比亚迪旗下方程豹品牌的首款车型&#xff0c;以“超级混动硬派SUV”著称的方程豹5&#xff0c;自然吸引了…

nuxt中extendRoutes添加多个扩展路由

文档中https://www.nuxtjs.cn/api/configuration-router有写使用extendRoutes添加多个路由 添加多个路由&#xff0c;数组拼接只能使用push&#xff0c;其实均不管用

【王道】操作系统笔记 第一章 操作系统概述

1.1.1 操作系统的概念和功能 我们熟悉的操作系统有哪些&#xff1f; 从计算机系统的层次结构上看操作系统&#xff1a; 以一台电脑的诞生为例&#xff1a; 第一步&#xff0c;厂家组装一台裸机 第二步&#xff0c;出售前安装操作系统 第三步&#xff0c;用户安装应用程序 第四…

一日一技:Python如何同时调用多个GPT的API?

相信很多同学或多或少都在Python中使用过GPT API&#xff0c;通过Python安装openai库&#xff0c;来调用GPT模型。 OpenAI官方文档中给出了一个示例&#xff0c;如下图所示&#xff1a; OpenAI API 测试 如果你只有一个API账号&#xff0c;那么你可能不觉得这样写有什么问题。…

其他计算机系统基础知识

其他计算机系统基础知识 概述计算机语言多媒体系统工程系统工程方法切克兰德方法并行工程方法综合集成法WSR方法 系统工程的生命周期基于模型的系统工程 概述 不考 学系统工程就行 整体来说考的概率不大&#xff0c;以了解为主 计算机语言 多媒体 15年之前考过 系统工程 系统工…

systemverilog仿真时候传递参数

$test$plusargs和$value$plusarg的区别和使用 本文参考的文章vcs2021 user guiger 别的版本可能会有不一样 纯学习笔记 文章原文 &#xff08; t e s t test testplusargs&#xff09; 在运行时启用调试功能 在“ifdef”编译器指令的位置使用 t e s t test testplusargs系…