Spring5路徑匹配器PathPattern解析
Spring5路徑匹配器PathPattern
PathPattern 對(duì)url地址匹配的處理更加快速,它和AntPathMatcher 主要差異如下:
1.PathPattern 只支持結(jié)尾部分使用 **
如果在路徑的中間使用 ** 就會(huì)報(bào)錯(cuò);
@GetMapping("/funyi/**")
public String act1() {
return "/funyi/**";
}
2.PathPattern 支持使用例如 {*path}
的方式匹配請(qǐng)求路徑,同時(shí)可以匹配到多級(jí)路徑,并將獲取的值賦給 對(duì)應(yīng)controller方法的形參path;
@GetMapping("/funyi/{*path}")
public void act2(@PathVariable String path) {
System.out.println("path = " + path);
}
SpringBoot 項(xiàng)目添加如下配置即可開(kāi)啟PathPattern:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setPatternParser(new PathPatternParser());
}
}
路徑匹配工具(AntPathMatcher vs PathPattern)
AntPathMatcher:Sping第一個(gè)版本(2013念)引入。PathPattern:Spring 5 引入,所在包:org.springframework.web.util.pattern.PathPattern,所屬模塊為spring-web。可見(jiàn)它專為Web設(shè)計(jì)的“工具”。
PathPattern去掉了Ant字樣,但保持了很好的向下兼容性:除了不支持將**寫(xiě)在path中間之外(以消除歧義),其它的匹配規(guī)則從行為上均保持和AntPathMatcher一致,并且還新增了強(qiáng)大的{*pathVariable} 的支持。整體上可認(rèn)為后者兼容了前者的功能。
PathPattern性能比AntPathMatcher好。理論上pattern越復(fù)雜,PathPattern的優(yōu)勢(shì)越明顯;AntPathMatcher可用于非Web環(huán)境,而PathPattern只適用于Web環(huán)境。所以PathPattern也不是能完全替代AntPathMatcher的。
內(nèi)部實(shí)現(xiàn)原理上看,AntPathMatcher進(jìn)行的是純字符串操作和比對(duì);而PathPattern則對(duì)于任何一個(gè)字符串的pattern最終都會(huì)被解析為若干段的PathElement,這些PathElement以鏈?zhǔn)浇Y(jié)構(gòu)連接起來(lái)用以表示該pattern,形成一個(gè)對(duì)象數(shù)據(jù),這種結(jié)構(gòu)化的表示使得可讀性更強(qiáng)、更具靈活性,從而獲得更好的性能表現(xiàn)。
兩者簡(jiǎn)單使用示例:
new AntPathMatcher().match("/api/v1/**", "/api/v1/2/3**");
new PathPatternParser().parse("/api/v1/**").matches(PathContainer.parsePath("/api/v1/2/3**"));
//每一個(gè)pathPattern串對(duì)應(yīng)一個(gè)PathPatternParser、每一個(gè)parsedPath串對(duì)應(yīng)一個(gè)PathContainer
可能有小伙伴會(huì)說(shuō):在Service層,甚至Dao層我也可以正常使用PathPattern對(duì)象呀,何解?
這個(gè)問(wèn)題就相當(dāng)于:HttpServletRequest屬于web層專用組件,但你依舊可以將其傳到Service層,甚至Dao層供以使用,在編譯、運(yùn)行時(shí)不會(huì)報(bào)錯(cuò)。但你可深入思考下,這么做合適嗎?
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring AbstractRoutingDatasource 動(dòng)態(tài)數(shù)據(jù)源的實(shí)例講解
本文介紹如何使用 Spring AbstractRoutingDatasource 基于上下文動(dòng)態(tài)切換數(shù)據(jù)源,因此我們會(huì)讓查找數(shù)據(jù)源邏輯獨(dú)立于數(shù)據(jù)訪問(wèn)之外2021-07-07
PowerJob的TimingStrategyHandler工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的TimingStrategyHandler工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
IDEA中的pom.xml文件無(wú)法識(shí)別問(wèn)題及解決
這篇文章主要介紹了IDEA中的pom.xml文件無(wú)法識(shí)別問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
基于javascript實(shí)現(xiàn)獲取最短路徑算法代碼實(shí)例
這篇文章主要介紹了基于javascript實(shí)現(xiàn)獲取最短路徑算法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
如何基于ThreadPoolExecutor創(chuàng)建線程池并操作
這篇文章主要介紹了如何基于ThreadPoolExecutor創(chuàng)建線程池并操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Java使用注解實(shí)現(xiàn)BigDecimal的四舍五入
BigDecimal是Java中的一個(gè)類,位于java.math包中,它提供了任意精度的有符號(hào)十進(jìn)制數(shù)字的表示,以及對(duì)這些數(shù)字進(jìn)行算術(shù)運(yùn)算的方法,本文介紹了Java使用注解實(shí)現(xiàn)BigDecimal的四舍五入的相關(guān)知識(shí),需要的朋友可以參考下2024-09-09
java開(kāi)發(fā)https請(qǐng)求ssl不受信任問(wèn)題解決方法
這篇文章主要介紹了java開(kāi)發(fā)https請(qǐng)求ssl不受信任問(wèn)題解決方法,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

