Spring5路径匹配器PathPattern解析

 更新时间:2021年11月24日 16:27:52   作者:生平无冕°  
这篇文章主要介绍了Spring5路径匹配器PathPattern,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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层供以使用,在编译、运行时不会报错。但你可深入思考下,这么做合适吗?

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot项目启动报错踩坑实战记录

    SpringBoot项目启动报错踩坑实战记录

    这篇文章主要给大家介绍了关于SpringBoot项目启动报错踩坑的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • 解决Maven项目中 Invalid bound statement 无效的绑定问题

    解决Maven项目中 Invalid bound statement 无效的绑定问题

    这篇文章主要介绍了解决Maven项目中 Invalid bound statement 无效的绑定问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java的各种集合为什么不安全(List、Set、Map)以及代替方案

    java的各种集合为什么不安全(List、Set、Map)以及代替方案

    这篇文章主要介绍了java的各种集合为什么不安全(List、Set、Map)以及代替方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Spring cloud如何实现FeignClient指定Zone调用

    Spring cloud如何实现FeignClient指定Zone调用

    这篇文章主要介绍了Spring cloud如何实现FeignClient指定Zone调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java实现的模糊匹配某文件夹下的文件并删除功能示例

    Java实现的模糊匹配某文件夹下的文件并删除功能示例

    这篇文章主要介绍了Java实现的模糊匹配某文件夹下的文件并删除功能,涉及java针对目录与文件的遍历、匹配、判断、删除等相关操作技巧,需要的朋友可以参考下
    2018-02-02
  • Intellij IDEA配置Jetty的方法示例

    Intellij IDEA配置Jetty的方法示例

    这篇文章主要介绍了Intellij IDEA配置Jetty的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 一篇文章带你入门java泛型

    一篇文章带你入门java泛型

    这篇文章主要介绍了java泛型基础知识及通用方法,从以下几个方面介绍一下java的泛型: 基础, 泛型关键字, 泛型方法, 泛型类和接口,感兴趣的可以了解一下
    2021-08-08
  • SpringBoot整合阿里云短信服务的案例代码

    SpringBoot整合阿里云短信服务的案例代码

    这篇文章主要介绍了SpringBoot整合阿里云短信服务的案例代码,在Spring Boot项目的pom.xml文件中添加阿里云短信服务SDK的依赖,本文通过示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2024-06-06
  • Java png图片修改像素rgba值的操作

    Java png图片修改像素rgba值的操作

    这篇文章主要介绍了Java png图片修改像素rgba值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 关于springboot集成swagger3时spring-plugin-core报错的问题

    关于springboot集成swagger3时spring-plugin-core报错的问题

    这篇文章主要介绍了关于springboot集成swagger3时spring-plugin-core报错的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论