当前位置: 首页 > news >正文

重学SpringBoot3-路径匹配机制

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-路径匹配机制

  • AntPathMatcher
  • PathPatternParser 和 PathPattern
  • 演示
    • AntPathMatcher 示例
    • PathPattern 示例
    • 性能和精确度的提升
  • 选择使用哪一种

在 Spring Framework 5.3 及 Spring Boot 2.4 之后,引入了一种新的路径匹配机制,这一变化在 Spring Boot 3 中得到了保留和进一步的应用。这个新机制主要是通过 PathPattern 代替了传统的 AntPathMatcherAntPathMatcher 是基于 Ant 风格的路径匹配,而 PathPattern 则是一个更高效、更精确的路径匹配方式,它是通过 PathPatternParser 解析得到的。

AntPathMatcher

  • 定义: AntPathMatcher 是 Spring 框架中一个基于 Ant 风格模式的路径匹配器,它支持使用 ?*** 等通配符进行匹配。

    • *:表示任意数量的字符。
    • ?:表示任意一个字符
    • :表示任意数量的目录**。
    • {}:表示一个命名的模式占位符
    • []:表示字符集合,例如[a-z]表示小写字母。
  • 用途: 主要用于 URL 模式匹配,比如在 Spring MVC 中定义 @RequestMapping 时就可以使用Ant风格的路径。

  • 特点: 灵活但在性能上可能不如PathPattern,尤其是在复杂模式匹配时。

PathPatternParser 和 PathPattern

  • PathPatternParser: 一个新的路径解析器,用于解析路径模式字符串,创建 PathPattern 对象。它引入了更严格的语法规则,并且设计了更高效的匹配算法。
  • PathPattern: 由 PathPatternParser 解析路径模式字符串得到的对象,代表了一种更加精确和高效的路径匹配方式。
  • 特点:
    • 性能: 相比 AntPathMatcherPathPattern 提供了更高的性能。这是因为 PathPattern 在匹配过程中采用了更加高效的算法,在 jmh 基准测试下,有 6~8 倍吞吐量提升,降低 30%~40%空间分配率。
    • 精确性: PathPattern 的语法规则更严格,能够提供更精确的匹配结果。
    • 使用场景: 在 Spring Framework 5.3 及之后的版本中,默认使用 PathPattern 进行路径匹配。如果你的应用是基于这些版本的 Spring Boot 构建的,那么在处理路径匹配时,你将会默认使用 PathPattern

演示

让我们通过具体的例子来进一步理解AntPathMatcherPathPattern之间的区别以及如何在实践中应用它们。

AntPathMatcher 示例

假设我们有以下的路径模式与 URL,来看看AntPathMatcher是如何进行匹配的:

  • 模式: /spring/*/example

    • URL: /spring/boot/example
    • 使用AntPathMatcher,这个URL与模式是匹配的,因为*可以匹配任意的一段文本(在这个例子中是boot)。
    @Slf4j
    @RestController
    public class HelloController {@GetMapping("/spring/*/example")public String hello(HttpServletRequest request) {//获取请求路径并返回return request.getRequestURI();}
    }
    

    /spring/*/example

  • 模式: /spring/**/example

    • URL: /spring/boot/java/example
    • 同样,这个URL与模式也是匹配的,因为**可以匹配任意长度的路径(在这个例子中是boot/java

    /spring/**/example

PathPattern 示例

PathPattern提供了更加精细的控制以及性能优化。使用PathPatternParser解析同样的模式,我们可以得到类似的匹配结果,但是PathPattern在解析和匹配的过程中更加高效:

  • 模式: /a*/b?/{c:[a-z]+}

    • “/a*”:表示以"/a"开头,后面可以跟任意数量的字符;
    • “/b?”:表示以"/b"开头,后面可以跟任意一个的字符;
    • “{c:[a-z]+}”:表示路径变量 c,其值必须是由一个或多个小写字母 a-z 组成的字符串。
    • URL: /abc/b1/ccc
    @Slf4j
    @RestController
    public class HelloController {@GetMapping("/a*/b?/{c:[a-z]+}")public String hello(HttpServletRequest request, @PathVariable("c") String variable) {log.info("variable:{}", variable);//获取请求路径并返回return request.getRequestURI();}
    }
    

    /a*/b?/{c:[a-z]+}

  • 模式: /spring/**/example: "*" 多段匹配的支持仅允许在模式末尾使用*,如果要使用需要切换到 AntPathMatcher 模式。

     "******" **多段匹配**
    解决办法:

    spring.mvc.pathmatch.matching-strategy=ant_path_matcher
    

性能和精确度的提升

PathPattern的一个主要改进是在于它的匹配算法,它使用了更少的字符串比较和更加高效的数据结构。这意味着在处理大量路由和复杂模式时,PathPattern能够提供更快的匹配速度和更低的内存占用。

此外,PathPattern支持一些新的匹配符,例如:

  • {spring:[a-z]+}: 表示路径段必须由一个或多个小写字母组成,且该段被捕获为名为spring的变量。
  • ?: 匹配任何单个字符
  • {*spring}: 贪婪匹配任意数量的字符,并将其捕获为名为spring的变量。

选择使用哪一种

在 Spring Boot 2.4 及以上版本中,默认使用 PathPatternParser。但是,开发者可以通过配置选择使用旧的 AntPathMatcher。如果你的应用需要向后兼容或者依赖于 AntPathMatcher 的特定行为,你可能会选择继续使用 AntPathMatcher

为了切换回 AntPathMatcher,你可以在你的 application.properties 或 application.yml 文件中设置以下属性:

spring.mvc.pathmatch.matching-strategy=ant_path_matcher

总的来说,PathPatternParserPathPattern 提供了一种更现代、更高效的路径匹配方式,适用于大多数新的 Spring 应用程序。但对于那些需要与旧代码库兼容或者有特定路径匹配需求的项目,AntPathMatcher 仍然是一个可行的选择。

相关文章:

重学SpringBoot3-路径匹配机制

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-路径匹配机制 AntPathMatcherPathPatternParser 和 PathPattern演示AntPathMatcher 示例PathPattern 示例性能和精确度的提升 选择使用哪一种 在 Spring…...

【贪心算法】摆动序列

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 &…...

Unload-labs

function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传的文件类型var allow_ext ".jpg|.png|.gif";//提取上传文件的类…...

SRS-220VDC-4Z-10A静态中间继电器 额定电压DC220V 四副转换触点 JOSEF约瑟

系列型号: SRS-24VDC-4Z-8A静态中间继电器;SRS-24VDC-4Z-10A静态中间继电器; SRS-24VDC-4Z-16A静态中间继电器;SRS-24VAC-4Z-8A静态中间继电器; SRS-24VAC-4Z-10A静态中间继电器;SRS-24VAC-4Z-16A静态中…...

解决electron打包vue-element-admin项目页面无法跳转的问题

解决electron打包vue-element-admin项目页面无法跳转的问题 说明之前通过这个教程已经打包成功,但是发现进行账号密码登录后页面无法跳转的问题。现在已经解决,所以记录一下。 1、检查路由模式是否为hash模式,如果不是改成hash模式。 new Ro…...

Uniapp Vue2 image src动态绑定static目录下的图片

报错的static地址写法&#xff1a; this.url ../static/img.png this.url /static/img.png 正确的static地址写法&#xff1a; this.url /static/img.png 动态绑定 <image :src"url"></image>...

【UE5】动画混合空间的基本用法

项目资源文末百度网盘自取 什么是动画混合空间 混合空间分为两种: 通过一个数值控制通过两个数值控制 下面通过演示让大家更直观地了解 在Character文件夹中单击右键,选择动画(Animation),选择旧有的混合空间1D 然后选择骨骼&#xff08;动画是基于骨骼显示的,所以需要选择…...

用红黑树封装实现map和set

目录 1、map和set的底层 2、map与set中的key关键值 3、红黑树迭代器的实现。 1、操作 2、-- 操作 3、和!操作 4、在红黑树中封装迭代器 5、map和set对迭代器的封装 1、map map中[]的重载 2、set 1、map和set的底层 map和set都是基于红黑树实现的。红黑树是一种自平衡…...

【阿里云系列】-部署ACK集群的POD应用日志如何集成到日志服务(SLS)中

介绍 我们在实际部署应用到阿里云的ACK集群后&#xff0c;由于后期应用服务的持续维护诉求可能需要跟踪排查问题&#xff0c;此时就要具备将应用的历史日志存档便于后期排查问题 处理方式 为了解决以上的普遍需求&#xff0c;需要将ACK中的应用日志采集到SLS的Logstore中,然…...

Vue中给当前页面传递参数并重新加载,vue使用this.$router.push跳转页面,给跳转过去的页面传参不一致时重新加载

vue通过this.$router.push给url传参&#xff0c;改变url但是当前页面不会自动刷新 跳转页面代码 this.$router.push({name: allbusiness,query: {pw_id: item.id} });1.使用 watch 监听 $route 对象的变化&#xff0c;当路由发生变化时重新加载数据或执行其他操作。 2.利用路…...

【扩散模型(一)】综述:扩散模型在文本生成领域应用

一、论文信息 1 标题 Diffusion models in text generation: a survey 2 作者 Qiuhua Yi, Xiangfan Chen, Chenwei Zhang, Zehai Zhou, Linan Zhu, Xiangjie Kong 3 研究机构 1 College of Computer Science and Technology, Zhejiang University of Technology, HangZho…...

K8S Pod

基本概念 Pod是K8S中非常重要的概念之一&#xff0c;是整个K8S架构的基础和核心。Pod是K8S调度的最小单位&#xff0c;是一个不可拆分的独立个体&#xff0c;K8S将多个业务上相关联的容器&#xff08;Docker容器&#xff09;合并到一起&#xff0c;组合成一个Pod&#xff0c;这…...

反向传播(backward propagation,BP) python实现

BP算法就是反向传播&#xff0c;要输入的数据经过一个前向传播会得到一个输出&#xff0c;但是由于权重的原因&#xff0c;所以其输出会和你想要的输出有差距&#xff0c;这个时候就需要进行反向传播&#xff0c;利用梯度下降&#xff0c;对所有的权重进行更新&#xff0c;这样…...

简单算命脚本

效果展示 文件内容 main.py文件 import json import random import time# 别挂配置数据 gua_data_path "data.json"# 别卦数据 gua_data_map {} fake_delay 10# 读取别卦数据 def init_gua_data(json_path):with open(gua_data_path, r, encodingutf8) as fp:gl…...

Lua-掌握Lua语言基础1

Lua是一种轻量级的脚本语言&#xff0c;广泛应用于游戏开发、嵌入式系统和其他领域。下面是Lua语言基础的介绍&#xff1a; 数据类型&#xff1a;Lua支持基本的数据类型&#xff0c;包括nil、boolean、number、string和table。其中&#xff0c;table是一种关联数组&#xff0c;…...

python-0003-pycharm开发虚拟环境中的项目

前言 在虚拟环境中创建好了python项目&#xff0c;使用pycharm进行开发 打开项目 使用pycharm打开项目 设置虚拟环境的解释器 File–>Settings–>Project(项目名)–>Python Interpreter–>添加解释器–>添加已经存在的解释器–>选择虚拟环境的解释器 …...

修改 MySQL update_time 默认值的坑

由于按规范需要对 update_time 字段需要对它做默认值的设置 现在有一个原始的表是这样的 CREATE TABLE test_up (id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 主键id,update_time datetime default null COMMENT 操作时间,PRIMARY KEY (id) ) ENGINEInnoDB DEF…...

基于亚马逊云EC2+Docker搭建nextcloud私有化云盘

亚马逊云科技EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马逊云科技AWS&#xff08;Amazon Web Services&#xff09;提供的一种云计算服务。EC2代表弹性计算云&#xff0c;它允许用户租用虚拟计算资源&#xff0c;包括CPU、内存、存储和网络带宽&#xff0…...

用try...catch进行判断

在写一些提交数据的判断上&#xff0c;有时候会写下面的ifelse的判断方法&#xff0c;少一点还好&#xff0c;多的话就很难受也不好看。 if(!that.driverObj.contrary){this.__utils.showToast(请先上传驾驶证副页图片);return false } if(!this.driverObj.start){this.__util…...

服务器遭遇挖矿病毒syst3md及其伪装者rcu-sched:原因、症状与解决方案

01 什么是挖矿病毒 挖矿病毒通常是恶意软件的一种&#xff0c;它会在受感染的系统上无授权地挖掘加密货币。关于"syst3md"&#xff0c;是一种特定的挖矿病毒&#xff0c;它通过在受感染的Linux系统中执行一系列复杂操作来达到其目的。这些操作包括使用curl从网络下载…...

Qwen2.5-VL-7B-Instruct开源大模型:支持中文优先的多模态理解部署方案

Qwen2.5-VL-7B-Instruct开源大模型&#xff1a;支持中文优先的多模态理解部署方案 1. 项目概述 Qwen2.5-VL-7B-Instruct是一款开源的视觉-语言多模态大模型&#xff0c;特别针对中文场景进行了优化。该模型能够同时处理图像和文本输入&#xff0c;实现跨模态的理解与生成任务…...

Android USB串口通信终极指南:智能家居物联网项目实战

Android USB串口通信终极指南&#xff1a;智能家居物联网项目实战 【免费下载链接】usb-serial-for-android Android USB host serial driver library for CDC, FTDI, Arduino and other devices. 项目地址: https://gitcode.com/gh_mirrors/us/usb-serial-for-android …...

35AE92 GJR5137200R0005电子模块

35AE92 GJR5137200R0005 电子模块是一款工业控制系统用的电子控制模块&#xff0c;通常用于西门子或ABB等自动化设备中&#xff0c;承担信号处理、控制逻辑执行及系统接口功能。开头&#xff1a;35AE92 GJR5137200R0005电子模块是工业自动化控制系统的重要组成部分&#xff0c;…...

STM32F103红外小车避坑指南:从Proteus仿真失败到实物调试成功

STM32F103红外小车避坑指南&#xff1a;从Proteus仿真失败到实物调试成功 第一次尝试用STM32F103做红外循迹小车时&#xff0c;我花了整整三天时间在Proteus里调试仿真&#xff0c;结果连最基本的电机转动都实现不了。直到把电路搬到实物上&#xff0c;才发现仿真环境里那些看似…...

抖音音乐高效解决方案:douyin-downloader批量下载与智能管理指南

抖音音乐高效解决方案&#xff1a;douyin-downloader批量下载与智能管理指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fall…...

如何用网盘直链下载助手突破限制提升效率:5个实用技巧

如何用网盘直链下载助手突破限制提升效率&#xff1a;5个实用技巧 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

如何突破设备限制?打造你的全场景跨平台开发中枢

如何突破设备限制&#xff1f;打造你的全场景跨平台开发中枢 【免费下载链接】code-server VS Code in the browser 项目地址: https://gitcode.com/GitHub_Trending/co/code-server 在多设备开发的时代&#xff0c;远程开发环境已成为连接不同终端的核心枢纽&#xff0…...

在QCS6490开发板上跑通Yolov8n目标检测:从ONNX模型到高通QNN格式的完整转换指南

在QCS6490开发板上部署Yolov8n目标检测&#xff1a;ONNX到QNN格式的终极转换手册 当嵌入式AI遇上高性能目标检测&#xff0c;QCS6490开发板与Yolov8n的组合正在工业质检、智能安防等领域掀起效率革命。本文将手把手带你突破模型转换的关键瓶颈——从标准ONNX格式到高通专属QNN格…...

Hunyuan-MT-7B-WEBUI新手必看:5分钟搞定部署,开启多语言翻译之旅

Hunyuan-MT-7B-WEBUI新手必看&#xff1a;5分钟搞定部署&#xff0c;开启多语言翻译之旅 1. 为什么选择Hunyuan-MT-7B-WEBUI 在全球化交流日益频繁的今天&#xff0c;语言障碍成为许多个人和团队面临的实际问题。Hunyuan-MT-7B-WEBUI作为腾讯混元开源系列中的翻译专用模型&am…...

Qwen2.5-14B-Instruct多轮记忆|像素剧本圣殿长剧本连贯性保障机制

Qwen2.5-14B-Instruct多轮记忆&#xff5c;像素剧本圣殿长剧本连贯性保障机制 1. 专业剧本创作的新范式 在创意写作领域&#xff0c;剧本创作一直面临着角色一致性、情节连贯性和风格统一性的挑战。传统创作工具往往只能提供片段式的辅助&#xff0c;而"像素剧本圣殿&qu…...