环境: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:/META-INF/resources/webjars/,file:E:/images/
 
该方式仅支持一种前缀匹配(spring.mvc.static-path-pattern)
自定义静态资源映射
可以继承 WebMvcConfigurationSupport 或者 WebMvcConfigurer 接口。
注: 继承 WebMvcConfigurationSupport 类时,在整合第三方时,一定程度上有可能导致某些未知异常 -- WebMvcConfigurer 接口有很多方法,第三方项目可能是实现该接口来处理的,此时所有该接口的实现类均失效,就有可能导致某些配置没有正确加载。
配置静态资源映射

 创建一个resourceHandlerMapping的bean对象(SimpleUrlHandlerMapping)
 
 WebMvcConfigurationSupport#resourceHandlerMapping
 
ResourceHandlerRegistry 中 addResourceHandler 方法添加前缀匹配路径,addResourceLocations 添加本地映射路径。配置之后就保存了一份列表,当获取Mapping时,返回 SimpleUrlHandlerMapping。
 
获取bean之后,对bean对象进行初始化过程
 
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)
 
配置跨域
CorsRegistry 跨域支持配置
访问静态资源过程
获取handler
DispatcherServlet#doDispatch
 DispatcherServlet#getHandler
 
 AbstractHandlerMapping#getHandler
 AbstractUrlHandlerMapping#getHandlerInternal
 AbstractUrlHandlerMapping#lookupHandler(java.lang.String, javax.servlet.http.HttpServletRequest)
 



通过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协议的路径,会截取开头到最后一个“/”位置
 










