spring mvc默认使用pathpattern(spring boot 2.6+起),性能提升6–8倍、内存降低30%–40%,但禁用中间通配(如/a//c非法),仅支持末尾/**,路径变量支持正则约束如{id:d+}。

Spring MVC 默认使用 AntPathMatcher(从 Spring 5.3 开始可切换为 PathPatternParser),它天然支持 Ant 风格路径匹配,无需额外引入依赖或手动配置匹配器实例。关键在于正确书写路径模式,并理解其匹配逻辑和常见陷阱。
Ant 风格路径语法要点
AntPathMatcher 支持以下通配符:
-
?:匹配单个字符(不包括路径分隔符
/);例如/user/?匹配/user/a或/user/1,但不匹配/user/ab -
*:匹配任意数量的**非路径分隔符字符**(即不跨目录);例如
/user/*匹配/user/profile,但不匹配/user/profile/edit -
**:匹配任意层级的子路径(包括空路径),必须单独作为路径段;例如
/api/**匹配/api、/api/v1、/api/v1/users/123/detail -
{var}:路径变量占位符,用于提取参数;例如
/user/{id}可捕获id值 -
{var:[a-z]+}:带正则约束的路径变量;例如
/post/{slug:[a-z0-9\-]+}只匹配小写字母、数字和短横线组成的 slug
@RequestMapping 及派生注解中的实际用法
直接在控制器方法上使用即可,Spring MVC 自动应用 AntPathMatcher:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
@RestController
public class UserController {
// 匹配 /user/123、/user/abc,但不匹配 /user/123/profile
@GetMapping("/user/{id}")
public User getUser(@PathVariable String id) { ... }
// 匹配 /api/v1/users 和 /api/v2/users,且提取版本号
@GetMapping("/api/{version}/users")
public List<user> listUsers(@PathVariable String version) { ... }
// 匹配 /files/report.pdf、/files/docs/2024/summary.xlsx 等任意深度
@GetMapping("/files/**")
public Resource getFile(HttpServletRequest request) {
String path = StringUtils.cleanPath(request.getRequestURI());
return fileService.loadAsResource(path.substring("/files".length()));
}
// 组合通配符:匹配 /admin/settings、/admin/settings/cache、/admin/settings/db/timeout
@PostMapping("/admin/settings/**")
public ResponseEntity> updateSettings(@RequestBody Map<string object> config) { ... }
}</string></user>
高级配置与注意事项
多数场景默认行为已足够,但以下情况需留意:
- 若需关闭后缀匹配(如避免
/user/123.json错误匹配到/user/{id}),在配置类中禁用:configurer.setUseSuffixPatternMatch(false);(Spring Boot 2.6+ 默认已关闭) - 区分大小写:AntPathMatcher 默认**区分大小写**;如需忽略,可全局设置:
antPathMatcher.setCaseSensitive(false);(通常不建议,易引发歧义) - 多个匹配规则冲突时,Spring 按“最长路径优先”原则选择;例如
/api/users/{id}优先于/api/** - 路径变量名不能重复;
/user/{id}/order/{id}是非法的,应改用不同名称如{userId}和{orderId}
替代方案:PathPattern(Spring 5.3+ 推荐)
虽然 Ant 风格仍完全支持,但新项目建议使用更高效、更安全的 PathPattern(基于预编译路径树):
- 自动启用(Spring Boot 2.6+ 默认使用),无需代码干预
- 不支持
**出现在中间(如/a/**/c非法),只允许结尾/** - 路径变量语法相同,正则约束也支持:
/post/{slug:[a-z0-9\-]+} - 若必须用 Ant 风格的灵活通配(如中间 **),保留 AntPathMatcher 即可,无兼容问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










