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

这篇具有很好参考价值的文章主要介绍了【SpringBoot】一、SpringBoot3新特性与改变详细分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

一、前置条件

  • Java 17或更高版本

  • Gradle 7.5+或Maven 3.5+

二、自动配置包位置变化

1、Springboot2.X

【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT

2、Springboot3.X

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

【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT

三、jakata api迁移

1、Springboot2.X

【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT

2、Springboot3.X

【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT

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

【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT

四 新特性 - 函数式接口

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请求接口

【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT

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拦截了
【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT

六、支持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架构

【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT

1.2 安装 VisualStudio

https://visualstudio.microsoft.com/zh-hans/free-developer-offers/
【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT
【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT
【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT
【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT

1.3 安装 GraalVM

    1. 安装
      下载 GraalVM + native-image
      【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT
      【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT
    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终端
    【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT
#从入口开始,编译整个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
    【SpringBoot】一、SpringBoot3新特性与改变详细分析,05_微服务专题,spring boot,java,SpringBoot3,GraalVM,AOT
常见问题

可能提示如下各种错误,无法构建原生镜像,需要配置环境变量;
● 提示其他找不到出现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文章来源地址https://www.toymoban.com/news/detail-527155.html

  • 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

到了这里,关于【SpringBoot】一、SpringBoot3新特性与改变详细分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot3 快速入门及原理分析

    环境工具 版本 SpringBoot 3.0.5+ IDEA 2021.2.1+ Java 17+ Maven 3.5+ Tomcat 10.0+ SpringBoot 能帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用(说明: SpringBoot底层是Spring ) SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术 特性: 快速创建 独立 Spring 应用

    2024年02月11日
    浏览(22)
  • SpringBoot3.X源码分析(启动流程)

    1 启动入口 静态辅助类,可用于运行使用默认配置(即我们添加的一系列注解)的指定源的 SpringApplication 。 primarySource - 要载入的主要源,即指定源,这里为传入的 Application.class  Class? :泛型决定了任何类都可以传入 args - 应用程序参数(通常从main方法传递) 返回:正在运

    2024年01月23日
    浏览(29)
  • [SpringBoot3]Web服务

    基于浏览器的B/S结构应用十分流行。SpringBoot非常适合Web应用开发,可以使用嵌入式Tomcat、Jetty、Undertow或Netty创建一个自包含的HTTP服务器。一个SpringBoot的Web应用能够自己独立运行,不依赖需要安装的Tomcat、Jetty等。 SpringBoot可以创建两种类型的Web应用 基于Servlet体系的Spring We

    2024年02月11日
    浏览(30)
  • SpringBoot3之GraalVM之Windows详细安装及使用教程

    我直接使用的是IDEA plugins文件夹下的maven 新建MAVEN_HOME环境变量 Path环境变量追加 因为GraalVM需要调用操作系统的底层工具,而Windows底层工具是VisualStudio,所以我们要先下载安装好VisualStudio。 下载Visual Studio Community 《Visual Studio Community官网下载》 下载完以后直接安装即可 选择

    2024年02月14日
    浏览(30)
  • SpringBoot3.0新特性:1、spring.factories文件废弃,自动配置包位置变化 2、Spring Native 快速体验 3、jakata api迁移 3、三方库的支持

    有自己写过starter包的友友们一定知道,一定用/META-INF/spring.factories文件定义发现自动配置,但是在springboot 2.7,这个文件就被弃用了,在springboot 3.0 就被彻底移除了。 比如之前定义的/META-INF/spring.factories文件: 而现在 这个/META-INF/spring.factories并不是不存在了,只是在3.0之后 外

    2024年02月10日
    浏览(35)
  • springboot3整合consul实现服务注册和配置管理快速入门

    服务注册: 配置管理: 注册中心的比较: 在微服务的世界中,服务注册是必不可少的。现在比较流行的也就是Consul和Nacos,Zookeeper没有管理界面,一般不建议使用,而Eureka已经处于停更,并且本身就存在很多bug,一般不建议使用! 我之前写过一篇spring boot整合nacos实现服务注

    2024年04月16日
    浏览(35)
  • Springboot3.X整合Dubbo3.XSpringCloudAlibaba微服务 2022.0 + Springboot3.X 集成 Dubbo实现对外调用http内部调用RPC

    近期自己新开了一套SpringCloud Alibaba微服务项目,接口使用了对外HTTP,内部RPC的设计,具体点说就是外部用户或客户端通过Nginx访问到Gateway网关再分发到各个服务,内部各个服务之间统一使用Dubbo RPC进行通信。下面是Springboot3.x集成Dubbo的分享: 1. 需要的关键依赖 2. 启动程序入

    2024年02月15日
    浏览(26)
  • 最新版 !快速掌握JDK17 + springboot3 + springcloud Alibaba : 1、 微服务环境搭建

    最新版 !快速掌握JDK17 + springboot3 + springcloud Alibaba 专栏 2、服务治理 Nacos Discovery 3、远程调用负载均衡 Ribbon 4、远程调用Feign 5、服务熔断降级 Sentinel 源码 为了方便讲解SpringCloud课程,我们以最常见的电商项目2个核心模块:商品模块、订单模块为例子,一一讲解SpringCloud组件

    2024年02月05日
    浏览(44)
  • 使用Gradle7.6.1 + SpringBoot3.0.2 + java17创建微服务项目(学习)

    这是一个大胆的决定 技术 版本 spring-boot 3.0.2 spring-cloud 2022.0.2 spring-cloud-alibaba 2022.0.0.0-RC2 mybatis-plus-boot-starter 3.5.3.1 mysql-connector-java 8.0.32 技术 版本 java 17 gradle 7.6.1 IDEA 2022.2.4 Nvcat 15 MySQL 8.0.32 打开IDEA创建 SpringBoot项目 删除父项目中的src模块 新建两个子项目(新建时会重新创建

    2024年02月06日
    浏览(73)
  • golang微服务框架特性分析及选型

    (以下框架均为go框架) 包括:Istio、go-zero、go-kit、go-kratos、go-micro、rpcx、kitex、goa、jupiter、dubbo-go、tarsgo   1、特性及使用场景 start统计截止至2024.04.01 序号 名称 特性 适用场景 stars 1 Istio Istio 是一个开源的服务网格(Service Mesh)解决方案,提供了流量管理、安全策略、监控

    2024年04月17日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包