当前位置: 首页 > 后端技术 > Java

SpringBoot3正式版将于11月24日发布:有哪些新特性?

时间:2023-04-01 23:56:14 Java

自2018年2月28日SpringBoot2.0发布以来,整个2.X版本已经过去了4年多,一共发布了95个不同的版本。不久前,2.X系列也迎来了他的最终版本:2.7。前几天我还写了一篇关于将SpringBoot从2.1版本升级到2.7的文章,而现在,SpringBoot3.0来了!时间定在本月24日,SpringBoot将发布最终的RELEASE3.0版本。到目前为止,SpringBoot3已经发布了6个版本,累计5个里程碑版本,2个RC候选版本。下面就跟着小编一起来看看SpringBoot3.0会有哪些重大变化吧。JAVA17我们比较关心的第一个也是最重要的是SpringBoot3版本最低支持Java17。还在用Java8的同学要升级了。下面是Java17之后的一些重要变化。Java14引入了recorderecord,https://openjdk.org/jeps/395。以前写一个类需要写一堆get、set方法。后来有了lombok,这些都省了。现在Java为我们提供了一种原生的写法。publicrecordUser(){}本质上是一个record修饰的final类,它的父类不是Object也不是于某君,而是java.lang.Record。Record类属性只能在头文件中声明,所有成员变量都是publicfinal,并且只能声明静态属性,但是可以声明成员方法和静态方法。公共记录用户(字符串用户名){staticintid;publicStringgetName(){returnthis.username;}}textblockstextblocks文本块在Java13引入,在Java15成为永久性的,https://openjdk。组织/jeps/378。以前我们将多行字符串复制到Java中时,会自动添加行结束符。Stringsql="SELECT\n"+"\t*\n"+"FROM\n"+"\tsys_user0\n"+"WHERE\n"+"\tuser_name='abc'";还有一个textblock函数之后,可以帮助我们更方便的定义包含多行文本的字符串字面量,他使用三引号作为起止分隔符。StringsqlBlock="""SELECT*FROMsys_user0WHEREuser_name='abc'""";switch表达式switch表达式在Java12引入,在Java14成为永久特性,https://openjdk.org/jeps/361。升级后的switch其实包含两个特性,一个是允许case使用多个常量,另一个是有返回值。新的casex->语法在使用上更加简洁,不需要为每个case都写一个break。Stringname="xiao";intret=switch(name){case"ai"->1;case"xiao","xian"->2;默认->0;};模式匹配模式匹配可以帮助我们简化instanceof代码。if(objinstanceofStrings){System.out.println(s.toLowerCase());}也可以用在switch-case语句中:staticdoublegetDoubleUsingSwitch(Objecto){returnswitch(o){caseIntegeri->i.doubleValue();caseFloatf->f.doubleValue();caseStrings->Double.parseDouble(s);默认->0d;};}sealed密封类sealed在Java15中引入,在Java17特性中成为永久性的。sealed密封类的主要作用是限制类的继承。比如我们有Animal类,Dog和Cat分别继承了它,并实现了eat方法。他们的进食行为不同,但是我们不希望人继承Animal,也不允许他继承动物的进食行为,就像下面这样通过sealed和permits关键字限制为sealed类,并且只有猫狗都能遗传。需要注意的是,父类定义为sealed后,子类必须是sealed、non-sealed或final。publicabstractsealedclassAnimalpermitsCat,Dog{publicabstractvoideat();}publicnon-sealedclassDogextendsAnimal{@Overridepublicvoideat(){System.out.println("dogeat");}}publicnon-sealedclassCatextendsAnimal{@Overridepublicvoideat(){System.out.println("cateat");}}JakartaEE9还有一个重要的变化,就是这次升级后,只支持JakartaEE9。使用Servlet5.0和JPA3.0规范,但是最新版本RC2已经升级到JakartaEE10,Servlet6.0默认使用JPA3.1规范。有些同学可能连雅加达是什么都不知道。这个英文单词的意思是印度尼西亚的首都雅加达。其实就是把我们熟知的JavaEE改名后才叫JakartaEE。比如我们之前的javax.servlet包现在叫做jakarta.servlet。因此,代码中所有使用HttpServletRequest等对象的import都需要修改。导入javax.servlet.http.HttpServletRequest;改为导入jakarta.servlet.http.HttpServletRequest;SpringNative也是SpringNative升级的一大特色。它支持使用GraalVM将Spring应用程序编译成本地可执行的镜像文件,可以显着提高启动速度、峰值性能并减少内存占用。我们传统的应用都是编译成字节码,然后通过JVM解释,最后编译成机器码运行,而SpringNative是通过AOT提前编译成机器码,在运行时直接静态编译成可执行文件。取决于JVM。关于AOT技术,在我之前写的文章中有提到:SpringBoot就是这样优化的,启动速度快到飞起来了!。演示这里我将简要演示如何使用它。首先,我们需要做一些准备工作:https://www.graalvm.org/downl...下载GraalVM,指定JAVA_HOME,exportJAVA_HOME=/Users/user/Desktop/graalvm-ce-java17-22.3.0/Contents/Home下载一个较新的IDEA,例如我使用最新的EAP版本下载一个较新的JDK,例如使用JDK17并通过SpringInitialzr新建一个项目,使用最新版本的SpringBoot3.0.0-SNAPSHOT,查看GraalVMNativeSupport,创建项目后添加测试Controller。@RestControllerpublicclassTestController{@GetMapping("/")publicStringhello(){return"GraalVM...";}}然后直接运行程序,发现启动时间大约需要1秒。然后执行生成镜像文件的命令:./gradlewnativeCompile这个过程比较耗时,大概2分钟就生成了。最后执行命令:./build/native/nativeCompile/demo2我们可以看到最终的启动时间是0.082秒,快了10多倍。这里我使用gradle。如果你使用maven,使用如下命令:1.mvnw-Pnativenative:compile2。./target/demo2其他依赖升级SpringBoot3最小依赖Spring6版本,所以对应的Spring版本也要改(没有人还在用Spring2),其他依赖升级如下:Kotlin1.7+Lombok1.18.22+(JDK17支持版本)Gradle7.3+另外,我想说的是SpringBoot2.7引入了新的自动组装方式META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,原写法spring.factories仍然兼容3.0以下的版本,新版本3.0之后,旧的写法spring.factories就不能用了。中间件相关开发的同学要注意。其他一些配置改动,SpringMVC的一些小改动就不说了,到时候可以看更新日志。最后,如果要升级,新版本发布后,会有基于SpringBoot2.7版本的迁移指南。参考:https://www.baeldung.com/spri...https://blogs.oracle.com/java...https://spring.io/blog/2022/0...https://github.com/spring-pro…