文章目录
一、SpringMVC自动配置概览
官网介绍
大多场景我们都无需配置
• 自动配置ContentNegotiatingViewResolver和BeanNameViewResolver解析器
• 静态资源服务支持(包括WebJars支持)
• 自动注册Converter、GenericConverter和Formatter转换器
• HttpMessageConverters消息转换器支持
• 自动注册MessageCodesResolver
• 静态index.html首页支持
• 自动应用ConfigurableWebBindingInitializer可自定义说明
如需保留Spring Boot MVC的自动配置并扩展MVC功能(如拦截器、格式化器、视图控制器等),开发者可添加自定义的WebMvcConfigurer配置类(无需添加@EnableWebMvc注解)。
若需自定义RequestMappingHandlerMapping、RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver实例,同时保留Spring Boot MVC的自动配置,可通过声明WebMvcRegistrations类型的Bean来提供这些组件的自定义实例。这些实例将交由Spring MVC进行后续初始化配置。如需参与或覆盖该过程,应配合使用WebMvcConfigurer。
如需完全接管Spring MVC配置(禁用自动配置),可添加带有@EnableWebMvc注解的自定义@Configuration配置类,或如@EnableWebMvc文档所述添加DelegatingWebMvcConfiguration配置类。
二、简单功能分析
创建项目
创建一个新项目。
勾选场景。
项目创建完成。
删除没用的东西。
添加yaml配置文件
1、静态资源访问
只要静态资源放在类路径下:/static (or /public or /resources or /META-INF/resources)
访问:当前项目根路径 / 静态资源名称。 就可以访问项目中的静态资源。
例如:http://localhost:8083/earth.gif
原理:静态映射/**
请求进来,先去找Controller看能不能处理,不能处理的请求又都交给静态资源处理器。
静态资源也找不到,就会返回404
在资源文件夹下新建这些静态资源路径。
2、静态资源访问前缀
静态资源默认无前缀
yaml中配置
1 spring:
2 mvc:
3 static-path-pattern: /res/**
访问方式就变成了:
当前项目 + static-path-pattern + 静态资源名 = 静态资源文件夹下找。
此时访问静态资源:http://localhost:8083/res/earth.gif
如果不使用默认静态资源路径。
3、webjars
自动映射。
https://www.webjars.org/
4、欢迎页支持
在静态路径下定义一个欢迎页页面index.html,然后运行重新生成, 运行就可以看到默认就是首页了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>你好,我是首页</h1>
</body>
</html>
需要注意的是:
可以配置静态资源路径。
但是不可以配置静态资源的访问前缀,否则导致index.html不能被默认访问。
server:
port: 8083
#spring:
# mvc:
# static-path-pattern: /res/** # 这个会导致welcome页面的失效
# resources:
# static-locations: [classpath:/abc/]
5、自定义Favicon
server:
port: 8083
#spring:
# mvc:
# static-path-pattern: /res/** # 这个会导致welcome页面的失效
# resources:
# static-locations: [classpath:/abc/]
6、静态资源配置原理
Spring Boot 对静态资源的自动配置主要通过 WebMvcAutoConfiguration
和 ResourceProperties
实现,核心逻辑如下:
1. 静态资源路径配置
默认情况下,Spring Boot 从以下路径加载静态资源:
classpath:/static/
classpath:/public/
classpath:/resources/
classpath:/META-INF/resources/
这些路径由 ResourceProperties
类定义:
@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
public class ResourceProperties {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
};
// 其他配置...
}
2. 静态资源映射规则
Spring Boot 通过 WebMvcAutoConfiguration.addResourceHandlers()
方法注册静态资源处理器:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
// 禁用静态资源映射
return;
}
// 默认映射 /** 到静态资源路径
registry.addResourceHandler("/**")
.addResourceLocations(this.resourceProperties.getStaticLocations())
.setCachePeriod(getCachePeriod());
}
- 请求流程:
- 先由
DispatcherServlet
尝试匹配控制器(Controller)。 - 若未匹配,则交给
ResourceHttpRequestHandler
处理静态资源请求。 - 若资源不存在,返回
404
。
- 先由
3. 自定义静态资源路径
通过 application.yml
修改配置:
spring:
resources:
static-locations: [classpath:/custom-static/] # 覆盖默认路径
cache:
period: 3600 # 缓存时间(秒)
4. 静态资源前缀配置
通过 static-path-pattern
添加访问前缀(如 /res/**
):
spring:
mvc:
static-path-pattern: /res/**
此时请求需通过 http://localhost:8080/res/xxx.js
访问资源。
5. 禁用静态资源映射
若需完全禁用自动配置:
spring:
resources:
add-mappings: false # 关闭静态资源映射
总结
Spring Boot 的静态资源管理通过自动配置简化开发,核心机制如下:
- 默认路径:从
classpath:/static/
等目录加载资源,无需额外配置。 - 请求处理:静态资源请求优先由
DispatcherServlet
处理,未匹配时转交ResourceHttpRequestHandler
。 - 灵活性:支持通过
application.yml
自定义路径、缓存和访问前缀。 - 注意事项:
- 配置
static-path-pattern
会影响欢迎页(index.html
)的默认访问。 - 禁用自动配置需谨慎,避免影响基础功能。
- 配置
开发者可根据需求选择保留默认配置或完全自定义,平衡便捷性与控制力。例如,生产环境中可通过缓存配置优化性能,而开发阶段可禁用缓存便于调试。理解底层原理后,能更高效地利用 Spring Boot 的自动化特性。