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


从 2018 年 2 月 28 号发布 Spring Boot 2.0 版本开始,整个 2.X 版本已经经过了 4 年多的时间,累计发布了 95 个不同的版本,而就在前不久,2.X 系列的也已经迎来了他的最终版本:2.7。

前几天我还写了一篇关于 Spring Boot 从 2.1 版本升级到 2.7 的文章,而现在,Spring Boot 3.0 也要来了!

时间就定在本月的 24 号,Spring Boot 将要发布 3.0 的最终 RELEASE 版本。

截止到现在为止,Spring Boot3已经发布了 6 个版本,累计 5 个里程碑版本,2 个 RC 候选版,现在就跟着我一起看下 Spring Boot 3.0 将会要哪些重大的变化。

JAVA 17#

对于我们比较关注的第一个最重要的事情就是,Spring Boot3 版本最低支持 Java17,还在万年 Java8 的同学,该升级就升级了吧,这里介绍一下关于 Java17 之后的一些重要改变。

record#

record 是在 Java14中引入的,https://openjdk.org/jeps/395 。

以前我们写一个类需要写一堆 get、set 方法,后来有了lombok之后这些都省了,现在 Java 给我们提供了原生的写法。

public record User() {}

本质上 record 修饰之后的类就是一个 final 类,而且他的父类不是 Object,也不是余某军,而是 java.lang.Record

record 类属性只能声明在头部,所有的成员变量都是 public final 的,而且只能声明静态属性,但是可以声明成员方法和静态方法。

public record User(String username) {
    static int id;
    public String getName(){
        return this.username;
    }
}

text blocks#

text blocks 文本块是在 Java13 引入的,并且在 Java15 版本成为永久特性以前我们复制一个多行的字符串到 Java 里,会自动加上行终止符。

 String sql = "SELECT/n" +
                "/t* /n" +
                "FROM/n" +
                "/tsys_user0 /n" +
                "WHERE/n" +
                "/tuser_name = 'abc'";

而有了文本块的功能之后,可以帮助我们更方便的定义包含多行文本的字符串字面量,他使用三引号作为开始和结束的分隔符。

String sqlBlock = """
                SELECT
                	*
                FROM
                	sys_user0
                WHERE
                	user_name = 'abc'
                """;

switch表达式

switch表达式是在 Java12 中引入的,在 Java14 成为永久特性,升级后的 switch 其实包含两个特性,一个是允许 case 使用多个常量,另外一个就是有返回值。

新增case x-> 语法,使用方面更加简洁,而且不需要再每个 case 写一个 break了。

String name = "xiao";
int ret = switch (name) {
  case "ai" -> 1;
  case "xiao", "xian" -> 2;
  default -> 0;
};

Pattern Matching 模式匹配

模式匹配可以帮助我们简化instanceof代码。

if (obj instanceof String s) {
    System.out.println(s.toLowerCase());
}

还可以在 switch-case 语句使用:

static double getDoubleUsingSwitch(Object o) {
    return switch (o) {
        case Integer i -> i.doubleValue();
        case Float f -> f.doubleValue();
        case String s -> Double.parseDouble(s);
        default -> 0d;
    };
}

sealed 密封类

sealed 在 Java15中引入,在 Java17成为永久特性。

sealed 密封类的主要作用就是限制类的继承。

比如我们有 Animal类,Dog 和 Cat 分别继承它,实现了 eat 方法,他们吃的动作是不一样的,但是我们不希望人能继承 Animal,不允许他去继承动物吃的行为,就可以像下面这样通过 sealed 和 permits 关键字限制它是一个密封类,只有猫和狗能够继承它。

需要注意,父类被定义为 sealed 之后,子类必须是 sealed、 non-sealed 或者 final。

public abstract sealed class Animal permits Cat, Dog {

    public abstract void eat();
}

public non-sealed class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("dog eat");
    }
}

public non-sealed class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("cat eat");
    }
}

Jakarta EE 9

另外一个很重要的变化就是本次升级之后,最低只支持 Jakarta EE 9,使用 Servlet5.0 和 JPA3.0 规范,不过最新版本RC2已经升级到了 JakartaEE 10,默认使用 Servlet6.0 和 JPA3.1 规范。

本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;

2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;

3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;

4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;

5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/293156.html

(0)
上一篇 2022年11月15日
下一篇 2022年11月15日

相关推荐

发表回复

登录后才能评论