环境:springboot-2.7.5
配置文件配置静态资源映射
springboot配置静态资源映射方式是通过 WebMvcAutoConfiguration 实现的
spring:
# resources:
# # 自springboot 2.5.5之后,该属性已经被废弃,使用spring.web.resources.static-locations代替
# static-locations: classpath:/static/,classpath:/META-INF/resources/,classpath:/META-INF/resources/webjars/,file:E:/images/
# 静态资源配置
mvc:
# 静态资源访问接口前缀
static-path-pattern: /static/**
web:
resources:
# 静态资源本地路径
static-locations: classpath:/static/,classpath:/META-INF/resources/,classpath:/M服务器托管网ETA-INF/resources/webjars/,file:E:/images/
该方式仅支持一种前缀匹配(spring.mvc.static-path-pattern)
自定义静态资源映射
可以继承 WebMvcConfigurationSupport 或者 WebMvcConfigurer 接口。
建议:
a、无须覆盖原有的静态资源,实现 WebMvcConfigurer 接口
b、需要覆盖静态资源,继承 WebMvcConfigurationSupport 类,重写所有资源映射
注意:
a、继承 WebMvcConfigurationSupport 类时,WebMvcAutoConfiguration 配置 和 其他所有实现 WebMvcConfigurer 接口的的配置都失效
b、实现 WebMvcConfigurer 接口时,最好通过 ResourceHandlerRegistry#hasMappingForPattern 方法判断一下,否则存在多个同名前缀,启动会报错
配置静态资源映射
创建一个resourceHandlerMapping的bean对象(SimpleUrlHandlerMapping)
WebMvcConfigurationSupport#resourceHandlerMapping
→添加静态资源映射并转化为 SimpleUrlHandlerMapping ↑
ResourceHandlerRegistry 中 addResourceHandler
方法添加前缀匹配路径,addResourceLocations
添加本地映射路径。配置之后就保存了一份列表,当获取Mapping时,返回 SimpleUrlHandlerMapping。
→将配置的静态资源映射转化为Map↑
获取bean之后,对bean对象进行初始化过程
→初始化bean↑
初始化方法,就是判断是否 实现 InitializingBean 接口 和 配置initMethod方法名(@Bean的initMethod、xml的init-method属性)
a、实现 InitializingBean 接口,调用afterPropertiesSet方法
b、指定initMethod方法名,反射调用方法
初始化方法前后,通过 BeanPostProcessor 的applyBeanPostProcessorsBeforeInitialization和applyBeanPostProcessorsAfterInitialization方法分别前后处理
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization(处理一些列BeanPostProcessor)
ApplicationContextAwareProcessor#postProcessBeforeInitialization
ApplicationContextAwareProcessor#invokeAwareInterfaces
ApplicationObjectSupport#setApplicationContext
ApplicationObjectSupport#initApplicationContext(org.springframework.context.ApplicationContext)
SimpleUrlHandlerMapping#initApplicationContext
SimpleUrlHandlerMapping#registerHandlers
AbstractUrlHandlerMapping#registerHandler(java.lang.String, java.lang.Object)
→缓存静态资源映射的handler供获取时使用↑
配置跨域
CorsRegistry 跨域支持配置
访问静态资源过程
获取handler
DispatcherServlet#doDispa服务器托管网tch
DispatcherServlet#getHandler
AbstractHandlerMapping#getHandler
AbstractUrlHandlerMapping#getHandlerInternal
AbstractUrlHandlerMapping#lookupHandler(java.lang.String, javax.servlet.http.HttpServletRequest)
→获取匹配的前缀路径↑
→获取目标handler↑
→目标handler添加跨域配置↑
→准备执行handler↑
通过handler解析路径
DispatcherServlet#doDispatch
HttpRequestHandlerAdapter#handle
ResourceHttpRequestHandler#handleRequest
PathResourceResolver#getResource(java.lang.String, javax.servlet.http.HttpServletRequest, java.util.List extends org.springframework.core.io.Resource>)
FileUrlResource#createRelative
UrlResource#createRelativeURL
new java.net.URL#URL(java.net.URL, java.lang.String)
StreamHandler#parseURL
org.springframework.http.converter.AbstractHttpMessageConverter#write
备注:
java.net.URLStreamHandler#parseURL解析url时,file协议的路径,会截取开头到最后一个“/”位置
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net