【SpringBoot】一、SpringBoot3新特性与改变详细分析

news2024/11/21 23:21:17

前言

本文适合具有springboot的基础的同学。

SpringBoot3改变&新特性

  • 一、前置条件
  • 二、自动配置包位置变化
    • 1、Springboot2.X
    • 2、Springboot3.X
  • 三、jakata api迁移
    • 1、Springboot2.X
    • 2、Springboot3.X
    • 3、SpringBoot3使用druid有问题,因为它引用的是旧的包
  • 四 新特性 - 函数式接口
    • 1、场景
    • 2.、核心类
  • 五、新特性Problemdetails
    • 1、Problemdetails 是一种新的规范
    • 2、详细说明
    • 3、开启后的效果
      • 3.1、先准备一个GET请求接口
      • 3.2、使用Post请求该接口
      • 3.3、添加problemdetails配置后再使用Post请求该接口
      • 3.4、原理分析
  • 六、支持GraalVM 与 AOT
    • 1. AOT与JIT
    • 2. GraalVM
      • 1.1.GraalVM架构
      • 1.2 安装 VisualStudio
      • 1.3 安装 GraalVM
      • 1.3安装 native-image 依赖
      • 1.4测试
    • 3、springboot整合graalvm
        • 第一步:添加插件
        • 第二步:生成native-image
        • 常见问题

一、前置条件

  • Java 17或更高版本

  • Gradle 7.5+或Maven 3.5+

二、自动配置包位置变化

1、Springboot2.X

在这里插入图片描述

2、Springboot3.X

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

在这里插入图片描述

三、jakata api迁移

1、Springboot2.X

在这里插入图片描述

2、Springboot3.X

在这里插入图片描述

3、SpringBoot3使用druid有问题,因为它引用的是旧的包

在这里插入图片描述

四 新特性 - 函数式接口

SpringMVC 5.2 以后 允许我们使用函数式的方式,定义Web的请求处理流程。
Web请求处理的方式:

    1. @Controller + @RequestMapping:耦合式 (路由、业务耦合)
    1. 函数式Web:分离式(路由、业务分离)

1、场景

场景:User RESTful - CRUD
● GET /user/1 获取1号用户
● POST /user 请求体携带JSON,新增一个用户
● DELETE /user/1 删除1号用户

2.、核心类

● RouterFunction - 路由函数
● RequestPredicate - 请求谓词
● ServerRequest - 请求
● ServerResponse -响应

##3、 代码示例

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.function.RequestPredicate;
import org.springframework.web.servlet.function.RouterFunction;
import org.springframework.web.servlet.function.ServerResponse;

import static org.springframework.web.servlet.function.RequestPredicates.accept;
import static org.springframework.web.servlet.function.RouterFunctions.route;

@Configuration(proxyBeanMethods = false)
public class MyRoutingConfiguration {

    private static final RequestPredicate ACCEPT_JSON = accept(MediaType.APPLICATION_JSON);

    @Bean
    public RouterFunction<ServerResponse> routerFunction(MyUserHandler userHandler) {
        return route()
                .GET("/{user}", ACCEPT_JSON, userHandler::getUser)
                .POST("/", ACCEPT_JSON, userHandler::addUser)
                .DELETE("/{user}", ACCEPT_JSON, userHandler::deleteUser)
                .build();
    }

}
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.function.ServerRequest;
import org.springframework.web.servlet.function.ServerResponse;

@Component
public class MyUserHandler {

    public ServerResponse getUser(ServerRequest request) {
        ...
        return ServerResponse.ok().build();
    }

    public ServerResponse addUser(ServerRequest request) {
        ...
        return ServerResponse.ok().build();
    }

    public ServerResponse deleteUser(ServerRequest request) {
        ...
        return ServerResponse.ok().build();
    }

}

五、新特性Problemdetails

1、Problemdetails 是一种新的规范

详见
RFC 7807: https://www.rfc-editor.org/rfc/rfc7807

就是会对一部分错误信息进行处理后再返回


@Configuration(proxyBeanMethods = false)
//需要我们再配置文件中配置过这个属性 spring.mvc.problemdetails.enabled=true
@ConditionalOnProperty(prefix = "spring.mvc.problemdetails", name = "enabled", havingValue = "true")
static class ProblemDetailsErrorHandlingConfiguration {

    @Bean
    @ConditionalOnMissingBean(ResponseEntityExceptionHandler.class)
    ProblemDetailsExceptionHandler problemDetailsExceptionHandler() {
        return new ProblemDetailsExceptionHandler();
    }

}

2、详细说明

  • ProblemDetailsExceptionHandler 是一个 @ControllerAdvice集中处理系统异常。
  • 处理以下异常。如果系统出现以下异常,会被SpringBoot支持以 RFC 7807规范方式返回错误数据

	@ExceptionHandler({
			HttpRequestMethodNotSupportedException.class, //请求方式不支持
			HttpMediaTypeNotSupportedException.class,
			HttpMediaTypeNotAcceptableException.class,
			MissingPathVariableException.class,
			MissingServletRequestParameterException.class,
			MissingServletRequestPartException.class,
			ServletRequestBindingException.class,
			MethodArgumentNotValidException.class,
			NoHandlerFoundException.class,
			AsyncRequestTimeoutException.class,
			ErrorResponseException.class,
			ConversionNotSupportedException.class,
			TypeMismatchException.class,
			HttpMessageNotReadableException.class,
			HttpMessageNotWritableException.class,
			BindException.class
		})

3、开启后的效果

3.1、先准备一个GET请求接口

在这里插入图片描述

3.2、使用Post请求该接口

{
    "timestamp": "2023-04-18T11:13:05.515+00:00",
    "status": 405,
    "error": "Method Not Allowed",
    "trace": "org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' is not supported\r\n\tat org.springframework.web.servlejava.base/java.lang.Thread.run(Thread.java:833)\r\n",
    "message": "Method 'POST' is not supported.",
    "path": "/users"
}

3.3、添加problemdetails配置后再使用Post请求该接口

spring.mvc.problemdetails.enabled=true

开启后 会使用新的MediaType

Content-Type: application/problem+json+ 额外扩展返回

并且返回信息也会变化

{
    "type": "about:blank",
    "title": "Method Not Allowed",
    "status": 405,
    "detail": "Method 'POST' is not supported.",
    "instance": "/users"
}

3.4、原理分析

主要是因为该请求异常被 HttpRequestMethodNotSupportedException拦截了
在这里插入图片描述

六、支持GraalVM 与 AOT

1. AOT与JIT

  • AOT:Ahead-of-Time(提前编译):程序执行前,全部被编译成机器码
  • JIT:Just in Time(即时编译): 程序边编译,边运行;
    编译:
    ● 源代码(.c、.cpp、.go、.java。。。) =编译= 机器码

2. GraalVM

https://www.graalvm.org/
GraalVM是一个高性能的JDK,旨在加速用Java和其他JVM语言编写的应用程序的执行,同时还提供JavaScript、Python和许多其他流行语言的运行时。
GraalVM提供了两种运行Java应用程序的方式:

    1. 在HotSpot JVM上使用Graal即时(JIT)编译器
    1. 作为预先编译(AOT)的本机可执行文件运行(本地镜像)。
      GraalVM的多语言能力使得在单个应用程序中混合多种编程语言成为可能,同时消除了外部语言调用的成本。

1.1.GraalVM架构

在这里插入图片描述

1.2 安装 VisualStudio

https://visualstudio.microsoft.com/zh-hans/free-developer-offers/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 安装 GraalVM

    1. 安装
      下载 GraalVM + native-image
      在这里插入图片描述
      在这里插入图片描述
    1. 配置
      修改 JAVA_HOME 与 Path,指向新bin路径
  • 3.验证JDK环境为GraalVM提供的即可:

1.3安装 native-image 依赖

安装 native-image 依赖:

    1. 网络环境好:参考:
      https://www.graalvm.org/latest/reference-manual/native-image/#install-native-image
gu install native-image
    1. 网络环境不好:使用下载的离线jar;native-image-xxx.jar文件
gu install --file native-image-installable-svm-java17-windows-amd64-22.3.2.jar
    1. 验证
native-image

1.4测试

第一步: 创建项目

    1. 创建普通java项目。编写HelloWorld类;
  •    使用mvn clean package进行打包
    
  •   确认jar包是否可以执行java -jar xxx.jar
    
  •     可能需要给 MANIFEST.MF添加 Main-Class: 你的主类
    
  • 第二部. 编译镜像
    ● 编译为原生镜像(native-image):使用native-tools终端
    在这里插入图片描述
#从入口开始,编译整个jar
native-image -cp springboot3-aot-1.0-SNAPSHOT.jar com.springboot3.MainApplication -o qidongchengxu

#编译某个类【必须有main入口方法,否则无法编译】
native-image -cp .\classes org.example.App 

3、springboot整合graalvm

第一步:添加插件

 <build>
        <plugins>
            <plugin>
                <groupId>org.graalvm.buildtools</groupId>
                <artifactId>native-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

第二步:生成native-image

  • 1、运行aot提前处理命令:mvn springboot:process-aot
  • 2、运行native打包:mvn -Pnative native:build -f pom.xml
    在这里插入图片描述

常见问题

可能提示如下各种错误,无法构建原生镜像,需要配置环境变量;
● 提示其他找不到出现cl.exe找不到错误
● 出现乱码
● 提示no include path set
● 提示fatal error LNK1104: cannot open file ‘LIBCMT.lib’
● 提示 LINK : fatal error LNK1104: cannot open file ‘kernel32.lib’
需要修改三个环境变量:Path、INCLUDE、lib

  • 1、 Path:添加如下值
 C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\bin\Hostx64\x64
  • 2、新建INCLUDE环境变量:值为
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\winrt
  • 3、新建lib环境变量:值为
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\lib\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64

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

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

相关文章

hdfs删除后空间不是释放,trash回收机制

一、现象 hdfs删除后&#xff0c;3天了还不删除&#xff0c;故排查排查问题 二、排查过程及原理 Trash机制&#xff0c;叫做回收站或者垃圾桶&#xff0c;默认情况下是不开启的。启用 Trash 功能后&#xff0c;从 HDFS 中删除某些内容时&#xff0c;文件或目录不会立即被清除&a…

【独家揭秘】微信可以自动加好友自动打招呼啦!

最近客户好友做某书内容爆了&#xff0c;每天都引流很多人来加他的微信&#xff0c;基本每天都需要花大量时间去通过好友&#xff0c;导致没有时间去做后续的维护发展客户&#xff0c;于是找到我大吐苦水&#xff0c;问我有什么办法可以解决&#xff1f; 嘿&#xff0c;这不巧了…

Python 基本数据类型(七)

文章目录 每日一句正能量Set&#xff08;集合&#xff09;Dictionary&#xff08;字典&#xff09;结语 每日一句正能量 生活里的累&#xff0c;一半源于生活本身&#xff0c;一半源于我们对待生活的态度。当我们感觉疲惫的时候&#xff0c;记得提醒自己保持一种幸福感&#xf…

二叉树OJ题:LeetCode--144.二叉树的前序遍历

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中第144道二叉树OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人…

考完啦,回归!

暑假加训&#xff01;&#xff01;&#xff01; 不能到时候被学弟比下去了!!! 冲冲冲&#xff01;&#xff01;&#xff01;

SpringBoot整合人大金仓(kingbase8)

因客户要求使用人大金仓数据库&#xff0c;因此最近在java适配人大金仓数据库&#xff0c;在此做下笔记&#xff0c;此为第三步&#xff0c;SpringBoot整合人大金仓&#xff08;kingbase8&#xff09; 1.创建与模式对应用户&#xff0c;如我所用模式为hhh-system&#xff0c;则…

RS-FAIRFRS: COMMUNICATION EFFICIENT FAIR FEDERATED RECOMMENDER SYSTEM

RS-FAIRFRS: COMMUNICATION EFFICIENT FAIR FEDERATED RECOMMENDER SYSTEM Anonymous authors Paper under double-blind review communication efficient fair federated recommender system ICLR 2023 1. What does literature study? 结合随机抽样和确定每轮通信中要抽样…

vmware总结

1、CD/DVD设置 如果设备状态没有勾选已连接&#xff0c;那么当挂载镜像的时候&#xff0c;就会提示找不到设备。

有没有好用的ai图片处理器?这几款软件都能实现ai图片处理

朋友们&#xff0c;我今天要和你们聊一聊一个非常有趣的话题——ai图片网站&#xff01;没错&#xff0c;你没听错&#xff0c;就是那种可以让你在瞬间找到想要的图片的神奇网站。想象一下&#xff0c;你需要一张火爆的表情包&#xff0c;或者一幅令人心旷神怡的风景图&#xf…

为什么高并发这么难?非停事故频频发生?一天宕机三次?【B站、唯品会也难幸免】我们该怎么做?

宕机事件 原因解析&#xff1a; 1、一方面故障是不可避免的&#xff0c;有人为的故障&#xff08;是人就容易出错的&#xff09;和非人为的故障&#xff08;机器 Failure&#xff09;。这些是无法避免的停机&#xff0c;还有有计划的停机&#xff0c;如发布新系统、升级维护、更…

PHP 的 Logo 为什么是大象?

因为大象是世界上最好的动物。 当然&#xff0c;这只是开玩笑&#xff0c;那么为什么PHP的LOGO是大象呢&#xff1f;还有哪些关于PHP的LOGO的有趣的事情呢&#xff1f; 吉祥物-大象 ElePHPant 是一款可爱的 PHP 吉祥物&#xff0c;其设计中有一头大象。 最初的LOGO 1998 年…

golang,OpenGL,计算机图形学(一)

开发环境与依赖 github.com/go-gl/gl/v4.1-core/gl github.com/go-gl/glfw/v3.2/glfw OpenGL只提供了绘图功能&#xff0c;创建窗口是需要自己完成的。这就需要学习相应操作系统的创建窗口方法&#xff0c;比较复杂&#xff0c;并且每个操作系统都不同。为简化创建窗口的过程…

JavaScript ,16种常用数组方法

前言 &#x1f4d7;众所周知&#xff0c;向后端请求数据&#xff0c;处理数据是前端工程师必备的技能&#xff0c;从后端请求回来的数据往往是数组的形式返回到前端&#xff0c;因此数组处理方法的重要性可想而知&#xff1b;每次在处理对应数据都需要查阅一下因此记录一下使用…

MVVM框架代码逻辑整合

文章目录 逻辑总结为什么要将业务和视图分开为了解耦数据不同数据层数据冗余视图层非业务数据业务数据再处理 保证各层数据的封闭性 逻辑总结 将前端分为视图层&#xff0c;中间层&#xff0c;业务层。 视图层负责页面渲染业务层负责数据处理中间层负责业务层和视图层的关系 …

Mariadb读写分离

zzhttps://mp.csdn.net/mp_blog/creation/editor/131087599https://mp.csdn.net/mp_blog/creation/editor/131087599准本环境 systemctl stop firewalld setenforce 0 #关闭防火墙 iptables -F 192.168.1.2 #主库服务器 192.168.1.3 #从库服…

【Flutter】Flutter 使用 json_serializable 进行 JSON 序列化

文章目录 一、前言二、 json_serializable 简介三、如何在 Flutter 中安装和配置 json_serializable四、json_serializable 的基本使用五、一个实际的 Flutter 应用示例六、版本信息七、总结 一、前言 嗯啊&#xff0c;你好呀&#xff01;欢迎来到我的博客。 今天我们要聊聊的…

基于安卓的初中英语语法APP设计与实现(源码+文档+PPT)

智能手机的普及使移动学习成为一种全新的学习方式,越来越受到研究者与学习者的关注。调查显示,移动学习对英语学习特别是应用英语的学习有良好的效果。基于Android设计开发的英语语法APP包含“练习题册”、“语法分析”、“搜索语法”三大功能模块,能够帮助学生利用碎片时间学习…

HBase(11):shell管理操作

1 status 例如:显示服务器状态 2 whoami 显示HBase当前用户,例如: 3 list 显示当前所有的表 4 count 统计指定表的记录数,例如: 5 describe 展示表结构信息 6 exists 检查表是否存在,适用于表量特别多的情况

nginxWebUI 远程命令执行漏洞

漏洞介绍 nginxWebUI是一款图形化管理nginx配置的工具&#xff0c;能通过网页快速配置nginx的各种功能&#xff0c;包括HTTP和TCP协议转发、反向代理、负载均衡、静态HTML服务器以及SSL证书的自动申请、续签和配置&#xff0c;配置完成后可以一键生成nginx.conf文件&#xff0c…

Adobe中修改注释签名

控制面板-> 系统和安全-> 管理工具-> 计算机管理-> 打开“计算机管理”对话框-> 在左边栏的系统工具下选择本地用户和组-> 点击“用户”->选择要改的用户名->右键重命名 打开Adobe Acrobat->点击"编辑"->首选项->注释 ->把 “登…