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

前言

本文适合具有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);@Beanpublic 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.hqwc.cn/news/3588.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 缓存数据库双写不一致怎么处理?

一、概述&#xff1a; Redis 缓存数据库可能会出现双写不一致的情况&#xff0c;这是因为在进行缓存更新时&#xff0c;同时有多个线程或进程对同一个缓存键进行读写操作&#xff0c;导致了数据的不一致性。 具体来说&#xff0c;假设有两个线程 A 和 B 都要对同一个缓存键进…

chatgpt赋能python:下载Python的方法及使用指南

下载Python的方法及使用指南 Python是一种高级编程语言&#xff0c;被广泛应用于各种领域。如果你是一名程序员或者对编程有兴趣&#xff0c;那么学习Python会是一个不错的选择。本文将介绍Python的下载方法&#xff0c;并提供使用Python的基础指南。 Python的下载方法 Pyth…

贪心算法详解

一.贪心算法详解 一、什么是贪心算法&#xff1f;二、贪心算法的应用场景三、使用Java代码实现贪心算法四、总结 前言 1.贪心算法&#xff08;Greedy Algorithm&#xff09;是一种经典的解题思路&#xff0c;它通过每一步的局部最优解&#xff0c;来达到全局最优解的目的。 贪心…

windows10 Linux子系统 Ubuntu 文件互相访问

ubuntu 访问Windows windows的磁盘被挂载到了/mnt下&#xff0c;可以看到我的电脑的c,d,e,f盘&#xff0c; windows 访问 ubuntu 在文件夹输入\wsl$ 再点击Ubuntu-22.04,进入文件夹

将mp4视频推流rtsp,并转为http直播流,在前端显示

最近有个需求&#xff0c;在vue页面的video组件播放直播流&#xff0c;本来想用flv.js&#xff0c;但是必须要flv格式才行&#xff0c;所以还是用原生video播放http直播流。 1. 将本地mp4推流rtsp 下载并解压EasyDarwin&#xff0c;双击EasyDarwin.exe运行&#xff0c;在控制…

面试之谈谈你对SpringMVC的理解:

1.把传统的MVC架构里面的Controller控制器进行了拆分。分成了前端控制器的DispatcherServlteth和后端控制器的Controoler. 2.吧Model模型拆分成了业务层Service和数据访问层Repository 3.在试图层&#xff0c;可以支持不同的试图&#xff0c;比图Freemakr,volocity,JSP等等。 所…

Flutter开发笔记:Flutter 布局相关组件

Flutter开发笔记 Flutter 布局与布局组件 - 文章信息 - Author: Jack Lee (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChineAddress of this article:https://blog.csdn.net/qq_28550263/article/details/131419782 【介绍】&am…

【前端基础知识】iframe如何实现项目集成?如何防止被XFS?

目录 iframe介绍iframe语法如何实现集成效果如何将自己的网站实现禁止访问 iframe介绍 HTML 内联框架元素 (<iframe>) 表示嵌套的 browsing context。它能够将另一个 HTML 页面嵌入到当前页面中。 iframe语法 <iframe src"" name"" width"…

【计算机网络】数据链路层--点对点协议PPP

1.概念 2.构成 3.封装成帧 - 帧格式 4.透明传输 4.1字节填充法&#xff08;面向字节的异步链路&#xff09; 4.2.比特填充法&#xff08;面向比特的同步链路&#xff09; 5.差错检测 6.工作状态 7.小结

SpringMvc接收前端发送的api请求参数问题笔记

SpringMvc接收前端发送的api请求参数问题笔记 get请求参数字符串日期转date接收 需要使用DateTimeFormat注解&#xff0c;来接收前端传的 http://xx.xx.xxx/xsdc?start2023-07-01 15:12:13&end2023-07-02 15:00:00 这种日期参数&#xff1b; 这样获取日期数据就能直接取…

Arduino uno 环境配置 for Mac

1、IDE 在官网下载 官网地址&#xff1a;https://www.arduino.cc/en/software 看到钱&#x1f4b0;不要怕&#xff0c;只是问你捐不捐款&#xff0c;不收钱&#xff0c;你直接安装就行 &#xff08;你也可以捐一点&#xff5e;&#xff09; 安装之后 2、安装驱动 地址 &…

MySQL 服务无法启动

问题场景&#xff1a; 启动mysql&#xff1a;net start mysql 临时解决办法&#xff1a; tasklist| findstr "mysql"taskkill/f /t /im mysqld.exemysqld --console重新打开一个cmd测试连接mysql 永久解决办法&#xff1a; 找到Mysql的根目录&#xff0c;删除dat…