Spring5路径匹配器PathPattern解析
作者:生平无冕° 发布时间:2021-07-09 00:12:28
Spring5路径匹配器PathPattern
PathPattern 对url地址匹配的处理更加快速,它和AntPathMatcher 主要差异如下:
1.PathPattern 只支持结尾部分使用 **
如果在路径的中间使用 ** 就会报错;
@GetMapping("/funyi/**")
public String act1() {
return "/funyi/**";
}
2.PathPattern 支持使用例如 {*path}
的方式匹配请求路径,同时可以匹配到多级路径,并将获取的值赋给 对应controller方法的形参path;
@GetMapping("/funyi/{*path}")
public void act2(@PathVariable String path) {
System.out.println("path = " + path);
}
SpringBoot 项目添加如下配置即可开启PathPattern:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setPatternParser(new PathPatternParser());
}
}
路径匹配工具(AntPathMatcher vs PathPattern)
AntPathMatcher
:Sping第一个版本(2013念)引入。PathPattern
:Spring 5 引入,所在包:org.springframework.web.util.pattern.PathPattern,所属模块为spring-web。可见它专为Web设计的“工具”。
PathPattern去掉了Ant字样,但保持了很好的向下兼容性:除了不支持将**写在path中间之外(以消除歧义),其它的匹配规则从行为上均保持和AntPathMatcher一致,并且还新增了强大的{*pathVariable} 的支持。整体上可认为后者兼容了前者的功能。
PathPattern
性能比AntPathMatcher好。理论上pattern越复杂,PathPattern的优势越明显;AntPathMatcher
可用于非Web环境,而PathPattern只适用于Web环境。所以PathPattern也不是能完全替代AntPathMatcher的。
内部实现原理上看,AntPathMatcher进行的是纯字符串操作和比对;而PathPattern则对于任何一个字符串的pattern最终都会被解析为若干段的PathElement,这些PathElement以链式结构连接起来用以表示该pattern,形成一个对象数据,这种结构化的表示使得可读性更强、更具灵活性,从而获得更好的性能表现。
两者简单使用示例:
new AntPathMatcher().match("/api/v1/**", "/api/v1/2/3**");
new PathPatternParser().parse("/api/v1/**").matches(PathContainer.parsePath("/api/v1/2/3**"));
//每一个pathPattern串对应一个PathPatternParser、每一个parsedPath串对应一个PathContainer
可能有小伙伴会说:在Service层,甚至Dao层我也可以正常使用PathPattern对象呀,何解?
这个问题就相当于:HttpServletRequest属于web层专用组件,但你依旧可以将其传到Service层,甚至Dao层供以使用,在编译、运行时不会报错。但你可深入思考下,这么做合适吗?
来源:https://blog.csdn.net/qq_40992386/article/details/118183850
猜你喜欢
- MyBatis 是一款常用的持久层框架,使得程序能够以调用方法的方式执行某个指定的SQL,将执行SQL的底层逻辑进行封装。多数与Spring
- 前言Hello!上一期我大致讲解了关于Collection单列集合以及它的子接口List集合的概述、特点和遍历等,今天我为大家讲解关于Col
- 使用POI读写Word doc文件 Apache poi的hwpf模
- 合并有序数组的实现java版本:实例代码public class Merge {//合并有序数组 public static v
- 前言研究表明,Java堆中对象占据最大比重的就是字符串对象,所以弄清楚字符串知识很重要,本文主要重点聊聊字符串常量池。Java中的字符串常量
- 简介switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JEP 361: Swi
- Google 发布的Material Design支持库,对我们的APP设计有很大的影响,如果重新设计APP,支持库应该直接用V4提升到V7
- 昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会的毒打,没吃过牢饭就不知道自由有多重要,没
- 1.Maven依赖<!-- Kettle --><dependency> <grou
- 在平时的开发中,我们会经常遇到这样一个需求,要在页面通过一个『导出』按钮把查询出的数据导出到 Excel 表格中。本文即为实现上述需求的一个
- 上传临时文件被删除引起报错的解决1.前言在项目中使用到了SpringBoot的上传实现了一个excel导入功能,上线后稳得一批,但突然有一天
- 方法● maxBy:获取流中最大元素;minBy:获取流中最小元素● joining:合并,将流中的元素,以字符串的形式拼接起来● summ
- 工作中一直都是一个人奋战一人一个项目,使用maven管理,看这个也挺好,但是总感觉没有充分发挥maven的功能,于是研究了一下这个,网上关于
- 一、什么是过滤器过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆权限控制
- 本文实例讲述了spring mvc 实现获取后端传递的值。分享给大家供大家参考,具体如下:jsp页面怎么获取从后端传递过来的值?JSTL 方
- java类的方法,我特别喜欢《java编程思想》里面的描述,这本书说java类之间的相互通信是通过消息。比如顾客类的对象调用一个eat方法,
- 1.springboot启动过程中,首先会收集需要加载的bean的定义,作为BeanDefinition对象,添加到BeanFactory中
- 本实例实现在jsp页面实现查询全国城市天气预报的功能,供大家参考,具体内容如下实例目录:实现效果:具体思路:从和风天气api那里取得具体城市
- 本文实例讲述了Java使用synchronized实现互斥锁功能。分享给大家供大家参考,具体如下:代码package per.thread;
- 继承的概念继承是面向对象编程中的一个概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类在继承父类的同时也