Spring 6.0和SpringBoot 3.0新特性

目录

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

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生成二进制可执行文件底层流程

    Spring 6.0和SpringBoot 3.0新特性_第1张图片

你可能感兴趣的:(Spring,SpringBoot,spring,spring,boot,java)