SpringBoot 3.0 来啦!

SpringBoot 3.0 来啦!!

大家好,我 是 Ding Jiaxiong。

没赶上热乎的,晚了两天,2022年11月24日,SpringBoot 3.0 正式发布了!

1 看看官网

看看官网 https://spring.io/learn

在这里插入图片描述

在这里插入图片描述

标题:Spring Boot 3.0 正式发布

他非常高兴地代表团队宣布 Spring Boot 3.0 现已普遍可用,并且3.0.0可以在 Maven Central 中找到。

这是自 4.5 年前发布 2.0 以来,Spring Boot 的第一次重大修订。它也是第一个支持Spring Framework 6.0和 GraalVM 的 Spring Boot GA 版本。

新版本的亮点包括:

  • Java 17 基线

  • 支持使用 GraalVM 生成原生镜像,取代实验性的 Spring Native 项目

    • 简单解释GraalVM Native Images

      GraalVM Native Images 提供了一种部署和运行 Java 应用程序的新方法。【嗦嘎】与 Java 虚拟机相比,本机映像可以以更小的内存占用和更快的启动时间运行。

      它们非常适合使用容器映像部署的应用程序,并且在与“功能即服务”(FaaS) 平台结合时特别有趣。

      与为 JVM 编写的传统应用程序不同,GraalVM Native Image 应用程序需要提前处理才能创建可执行文件。这种提前处理涉及从应用程序的主要入口点静态分析您的应用程序代码。

      GraalVM Native Image 是一个完整的、特定于平台的可执行文件。您无需发布 Java 虚拟机即可运行本机映像。【牛逼】

  • 通过千分尺和千分尺追踪提高可观察性

  • 支持具有 EE 9 基线的 Jakarta EE 10

再次感谢多年来为 Spring 和 Spring Boot 做出贡献的所有人!支持 Jakarta EE 9 和 10、可观察性增强以及 GraalVM 支持是一项巨大的团队努力,Spring 产品组合的方方面面都未受影响。特别感谢 Spring 组合中其他项目的开发人员,没有他们就不可能有这个版本。

2 看看GitHub Wiki

仓库地址:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes

在这里插入图片描述

一些新的 和值得 注意的:

  1. Java 17 基线和 Java 19 支持

    Spring Boot 3.0 要求 Java 17 作为最低版本。如果您当前使用的是 Java 8 或 Java 11,则需要先升级 JDK,然后才能开发 Spring Boot 3.0 应用程序。

    Spring Boot 3.0 也运行良好,并已通过 JDK 19 测试。

    GraalVM 基线和本机构建工具

    Spring Boot 需要 Graal 22.3 或更高版本和 Native Build Tools Plugin 0.9.17 或更高版本

  2. 第三库升级

    Spring Boot 3.0 基于并需要 Spring Framework 6。

    此版本中升级的其他 Spring 项目包括:

    Spring Boot 3.0 已将所有依赖项从 Java EE 迁移到 Jakarta EE API。尽可能选择 Jakarta EE 10 兼容依赖项,包括:

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

    我们还尽可能升级到第三方 jar 的最新稳定版本。这里一些值得注意的依赖项升级包括:

    GraalVM 本机镜像支持

    Spring Boot 3.0 应用程序现在可以转换为 GraalVM 原生镜像【笔者还第一次 看见这个东西】,这可以提供显着的内存和启动性能改进。支持 GraalVM Native Images 是整个 Spring 产品组合中的一项重大工程工作。

    【开始使用GraalVM 原生镜像 → https://docs.spring.io/spring-boot/docs/3.0.0-SNAPSHOT/reference/html/native-image.html#native-image

    Log4j2 增强功能

    Log4j2 支持已更新为提供以下功能的新扩展:

    • 配置文件特定的配置
    • 环境属性查找
    • Log4j2 系统属性

    【详细信息 → https://docs.spring.io/spring-boot/docs/3.0.0-SNAPSHOT/reference/html/features.html#features.logging.log4j2-extensions】

    改进的@ConstructorBinding 检测

    使用构造函数绑定时@ConfigurationProperties@ConstructorBinding如果类具有单个参数化构造函数,则不再需要注释。如果您有多个构造函数,您仍然需要使用@ConstructorBinding来告诉 Spring Boot 使用哪一个。

    对于大多数用户来说,这个更新后的逻辑将允许使用更简单的@ConfigurationProperties类。但是,如果您有一个@ConfigurationProperties并且想要将 bean 注入构造函数而不是绑定它,那么您现在需要添加一个@Autowired注释。

    Micrometer 更新

    … 【读不下去了,大家自行查看文档吧,笔者太菜了】

  3. Spring Boot 3.0 中的弃用

    • @ConstructorBinding已从org.springframework.boot.context.properties包中移至org.springframework.boot.context.properties.bind.
    • JsonMixinModule基于扫描的构造函数已被弃用。
    • ClientHttpRequestFactorySupplier应替换为ClientHttpRequestFactories.
    • comment不再支持Cookie属性。
    • RestTemplateExchangeTagsProviderWebClientExchangeTagsProviderWebFluxTagsProviderWebMvcTagsProvider相关类已替换为ObservationConvention等效类。
    • 基类上的无参数构造函数HealthContributor @Configuration已被弃用。
    • DefaultTestExecutionListenersPostProcessor并且SpringBootDependencyInjectionTestExecutionListener已被弃用,取而代之的是 Spring Framework 的ApplicationContextFailureProcessor.
    • 属性management.metrics.export.<product>已弃用,替换为management.<product>.metrics.export.
    • 有利于的push设定。management.prometheus.metrics.export.pushgateway.shutdown-operation``post
    • @AutoConfigureMetrics已被弃用,取而代之的是@AutoConfigureObservability.

3 我的第一个 SpringBoot 3.0 应用程序

3.1 SpringBoot 介绍

Spring Boot 可帮助开发者创建可以运行的独立的、生产级的基于 Spring 的应用程序。我们对 Spring 平台和第三方库有自己的看法,这样您就可以轻松上手。大多数 Spring Boot 应用程序需要很少的 Spring 配置。

您可以使用 Spring Boot 创建可以通过使用java -jar或更传统的 war 部署启动的 Java 应用程序。我们还提供了一个运行“spring scripts”的命令行工具。

我们的主要目标是:

  • 为所有 Spring 开发提供速度极快且可广泛访问的入门体验。
  • 开箱即用,但随着需求开始偏离默认值,请迅速摆脱困境。
  • 提供一系列大型项目通用的非功能特性(例如嵌入式服务器、安全性、指标、健康检查和外部化配置)。
  • 绝对没有代码生成,也不需要 XML 配置。
3.2 系统要求

Spring Boot 3.0.0 需要Java 17,并且兼容 Java 19(包括 Java 19 )。还需要Spring Framework 6.0.2或更高版本。

为以下构建工具提供显式构建支持:

Build ToolVersion
Maven3.5+
Gradle7.x (7.5 or later)
3.2.1 服务程序容器

Spring Boot 支持以下嵌入式 servlet 容器:

NameServlet Version
Tomcat 10.05.0
Jetty 11.05.1
Undertow 2.2 (Jakarta EE 9 variant)5.0

您还可以将 Spring Boot 应用程序部署到任何 servlet 5.0+ 兼容容器。

3.2.2 GraalVM 原生镜像

可以使用 GraalVM 22.3 或更高版本将 Spring Boot 应用程序转换为本机映像。

可以使用原生构建工具Gradle/Maven 插件或native-imageGraalVM 提供的工具来创建镜像。您还可以使用原生镜像 Paketo buildpack创建原生镜像。

支持以下版本:

NameVersion
GraalVM Community22.3
Native Build Tools0.9.18
3.3 安装Spring Boot

Spring Boot 可以与“经典”Java 开发工具一起使用,也可以作为命令行工具安装。无论哪种方式,您都需要Java SDK v17或更高版本。

在开始之前,您应该使用以下命令检查当前的 Java 安装:

$ java -version

在这里插入图片描述

如果您是 Java 开发的新手,或者想尝试使用 Spring Boot,您可能想先尝试Spring Boot CLI(命令行界面)。

Spring Boot CLI(命令行界面)是一个命令行工具,可用于使用 Spring 快速制作原型。它允许您运行Groovy脚本,这意味着您拥有熟悉的类似 Java 的语法,而没有那么多样板代码。

您不需要使用 CLI 来使用 Spring Boot,但这是在没有 IDE 的情况下启动 Spring 应用程序的快速方法。

否则,请继续阅读“经典”安装说明。【不用了!!!!】

3.3.1 面向Java 开发人员的安装说明

您可以像使用任何标准 Java 库一样使用 Spring Boot。为此,请spring-boot-*.jar在您的类路径中包含适当的文件。Spring Boot 不需要任何特殊工具集成,因此您可以使用任何 IDE 或文本编辑器。此外,Spring Boot 应用程序没有什么特别之处,因此您可以像运行任何其他 Java 程序一样运行和调试 Spring Boot 应用程序。

虽然您可以复制 Spring Boot jar,但我们通常建议您使用支持依赖管理的构建工具(例如 Maven 或 Gradle)。

在这里插入图片描述

OK。

3.3.2 安装Spring Boot CLI

【笔者就不安了,这文档真 … 细】

3.4 开发第一个Spring Boot 应用程序【3.0】

本节介绍如何开发一个小的“Hello World!” 突出显示 Spring Boot 的一些关键功能的 Web 应用程序。我们使用 Maven 来构建这个项目,因为大多数 IDE 都支持它。

3.4.1 创建POM

笔者这里 直接就基于 IDEA 构建了

来一个 崭新的Maven 工程吧

这里就一步步来了,看看现在的IDEA 吧

在这里插入图片描述

妙啊,这里就先不用了

在这里插入图片描述

直接创建!

在这里插入图片描述

OK,一个全新的 Maven 工程。

【引入父依赖】

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.dingjiaxiong</groupId>
    <artifactId>MyFirstSpringBoot3</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.0</version>
    </parent>

</project>

在这里插入图片描述

OK

3.4.2 添加类路径依赖

Spring Boot 提供了许多“Starters”,可让您将 jar 添加到类路径中。我们的冒烟测试应用程序使用POM 部分中的spring-boot-starter-parentparentspring-boot-starter-parent是一个提供有用的 Maven 默认值的特殊启动器。它还提供了一个dependency-management部分,以便您可以省略version“blessed”依赖项的标签。【意思就是 版本 我帮你管了,你不用写】

还是我们熟悉 的web 依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

在这里插入图片描述

Cool

3.4.3 编写代码

现在就 可以编写代码了

要完成我们的应用程序,我们需要创建一个 Java 文件。默认情况下,Maven 从 编译源代码src/main/java,因此您需要创建该目录结构,然后添加一个名为src/main/java/MyApplication.java包含以下代码的文件:

package com.dingjiaxiong;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * ClassName: com.dingjiaxiong.MyApplication
 * date: 2022/11/25 20:34
 *
 * @author DingJiaxiong
 */

@RestController
@SpringBootApplication
public class MyApplication {

    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}

在这里插入图片描述

OK【简单解释下吧】

【1】@RestController 和@RequestMapping 注解

MyApplication的第一个类级注解是@RestController. 这称为构造型注释。它为阅读代码的人和 Spring 提供了该类扮演特定角色的提示。在这种情况下,我们的类是一个 web @Controller,因此 Spring 在处理传入的 web 请求时会考虑它。

@RequestMapping注释提供“路由”信息。它告诉 Spring,任何带有/路径的 HTTP 请求都应该映射到该home方法。注释告诉 Spring将@RestController结果字符串直接呈现给调用者。

【2】@SpringBootApplication 注解

第二个类级注释是@SpringBootApplication. 这个注解被称为元注解,它结合了@SpringBootConfiguration,@EnableAutoConfiguration@ComponentScan

其中,我们在这里最感兴趣的注解是@EnableAutoConfiguration. @EnableAutoConfiguration告诉 Spring Boot 根据您添加的 jar 依赖项“猜测”您想要如何配置 Spring。由于spring-boot-starter-web添加了 Tomcat 和 Spring MVC,自动配置假定您正在开发 Web 应用程序并相应地设置 Spring。

【3】 main 方法

我们应用程序的最后一部分是main方法。这是一个标准方法,它遵循应用程序入口点的 Java 约定。我们的主要方法通过调用委托给 Spring Boot 的SpringApplicationrunSpringApplication引导我们的应用程序,启动 Spring,而 Spring 又会启动自动配置的 Tomcat Web 服务器。我们需要将MyApplication.class参数作为参数传递给该run方法,以判断SpringApplication哪个是主要的 Spring 组件。该args数组也被传递以公开任何命令行参数。

3.4.4 运行示例

此时,您的应用程序应该可以工作了。由于您使用了spring-boot-starter-parentPOM,因此您有一个有用的run目标可以用来启动应用程序。

直接启动!

在这里插入图片描述

OK,打开浏览器,访问 localhost:8080

在这里插入图片描述

OK,就这样吧~ 【也算是 用了 一手新版本,哈哈哈哈哈】

4 最后想说的

除了最低环境要求【Java 17】,以及大量依赖升级了之外,支持 GraalVM 原生镜像 这感觉是一个非常大的更新了 【笔者的拙见】

4.1 GraalVM 原生镜像 是什么?

官网文档:

https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html#native-image.introducing-graalvm-native-images

在这里插入图片描述

GraalVM Native Images是独立的可执行文件,可以通过提前处理已编译的 Java 应用程序来生成。Native Images 通常比它们的 JVM 对应物具有更小的内存占用并且启动更快。

又一个笔者第一次 听的概念

https://www.graalvm.org/native-image/

在这里插入图片描述

原生镜像 → 编写高效、更安全、即时可扩展的云原生 Java 应用程序

【简单介绍】

Native Image 是一种提前将 Java 代码编译为二进制文件(本机可执行文件)的技术。本机可执行文件仅包含运行时所需的代码,即应用程序类、标准库类、语言运行时和来自 JDK 的静态链接本机代码。

Native Image 生成的可执行文件有几个重要的优点,因为它

  • 使用 Java 虚拟机所需资源的一小部分,因此运行成本更低
  • 以毫秒为单位开始
  • 立即提供最佳性能,无需预热
  • 可打包成轻量级容器镜像,实现快速高效部署
  • 减少攻击面

OK,看个响就行

4.2 引入GraalVM 原生镜像

GraalVM Native Images 提供了一种部署和运行 Java 应用程序的新方法。与 Java 虚拟机相比,本机映像可以以更小的内存占用和更快的启动时间运行。

它们非常适合使用容器映像部署的应用程序,并且在与“功能即服务”(FaaS) 平台结合时特别有趣。

与为 JVM 编写的传统应用程序不同,GraalVM Native Image 应用程序需要提前处理才能创建可执行文件。这种提前处理涉及从应用程序的主要入口点静态分析您的应用程序代码。

GraalVM Native Image 是一个完整的、特定于平台的可执行文件。您无需发布 Java 虚拟机即可运行本机映像。

4.2.1 与JVM 部署的主要区别

提前生成 GraalVM 本机映像这一事实意味着本机应用程序和基于 JVM 的应用程序之间存在一些关键差异。

主要区别是:

  • 应用程序的静态分析是在构建时从main入口点执行的。
  • 创建本机映像时无法访问的代码将被删除,并且不会成为可执行文件的一部分。
  • GraalVM 不直接感知代码的动态元素,必须告知反射、资源、序列化和动态代理。
  • 应用程序类路径在构建时是固定的,不能更改。
  • 没有惰性类加载,可执行文件中的所有内容都将在启动时加载到内存中。
  • 未完全支持的 Java 应用程序的某些方面存在一些限制。

嗯,每一点都很“生硬”

4.2.2 了解Spring 提前处理

典型的 Spring Boot 应用程序非常动态,配置在运行时执行。事实上,Spring Boot 自动配置的概念在很大程度上取决于对运行时状态的反应,以便正确配置。

虽然可以将应用程序的这些动态方面告诉 GraalVM,但这样做会抵消静态分析的大部分好处。因此,当使用 Spring Boot 创建本机镜像时,会假定一个封闭的世界并且应用程序的动态方面受到限制。

封闭世界假设意味着以下限制:

  • 类路径是固定的,并在构建时完全定义
  • 在您的应用程序中定义的 bean 不能在运行时更改,这意味着:
    • 不支持Spring@Profile注释和特定于配置文件的配置
    • 不支持在创建 bean 时更改的属性(例如,@ConditionalOnProperty.enable属性)。

当这些限制到位时,Spring 可以在构建时执行提前处理并生成 GraalVM 可以使用的额外资产。Spring AOT 处理的应用程序通常会生成:

  • Java源代码
  • 字节码(用于动态代理等)
  • GraalVM JSON 提示文件:
    • 资源提示 ( resource-config.json)
    • 反思提示 ( reflect-config.json)
    • 序列化提示 ( serialization-config.json)
    • Java 代理提示 ( proxy-config.json)
    • JNI 提示 ( jni-config.json)

OK,差不多就这亚子吧。路漫漫其修远兮,吾将上下而求索

我们一定能够成为我们想要去成为的人。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ding Jiaxiong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值