在 Spring MVC 中,通过重写 WebMvcConfigurer 的 addResourceHandlers 方法可自定义静态资源映射,支持多路径前缀、多资源位置(如 classpath:/static/、file:/data/uploads/)、缓存控制及版本化 URL。

在 Spring MVC 中,通过重写 WebMvcConfigurer 的 addResourceHandlers 方法,可以灵活配置静态资源(如 CSS、JS、图片)的请求路径与实际文件系统或类路径位置的映射关系,从而支持自定义 URL 前缀、多目录源、缓存控制等需求。
覆盖 addResourceHandlers 实现自定义静态资源映射
只需创建一个配置类实现 WebMvcConfigurer,并重写 addResourceHandlers 方法,在其中调用 registry.addResourceHandler(...).addResourceLocations(...) 即可完成映射:
-
resourceHandler:定义浏览器访问的 URL 路径模式,支持 Ant 风格(如
/static/**、/assets/**) -
resourceLocations:指定对应的实际资源位置,支持多种前缀:
— classpath:/static/(类路径下的 static 目录)
— classpath:/public/(类路径下其他静态目录)
— file:/opt/myapp/resources/(服务器本地绝对路径)
— https://cdn.example.com/(外部 CDN,需配合ResourceChainRegistration或自定义ResourceResolver)
支持多个路径前缀与多源映射
可以链式添加多个 handler,实现不同 URL 前缀映射到不同资源位置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 将 /static/** 映射到 classpath:/static/ 和 classpath:/public/
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/", "classpath:/public/");
<pre class="brush:php;toolbar:false;"> // 将 /uploads/** 映射到服务器本地目录
registry.addResourceHandler("/uploads/**")
.addResourceLocations("file:/data/uploads/");
// 将 /webjars/** 映射到 WebJars(自动启用)
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}}
启用缓存与版本控制(避免强制刷新)
为提升性能并支持前端资源更新,可在 resource handler 中开启缓存和内容哈希支持:
- 调用
.setCachePeriod(3600)设置 HTTP 缓存时间(秒) - 配合
ResourceUrlProvider或使用VersionResourceResolver实现带哈希的文件名(如app.a1b2c3.js),需同时启用resourceChain(true) - 示例:
registry.addResourceHandler("/js/**") .addResourceLocations("classpath:/static/js/") .setCachePeriod(3600) .resourceChain(true) .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
注意默认静态路径与覆盖逻辑
Spring Boot 默认已注册以下路径:/static、/public、/resources、/META-INF/resources。若你显式重写 addResourceHandlers,默认映射将被完全覆盖 —— 所以如需保留默认行为,必须手动重新声明它们,或仅追加新规则(不推荐依赖隐式行为)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











