随笔记录-springmvc_ResourceHandlerRegistry+ResourceHttpRequestHandler

环境:springboot-2.7.5

配置文件配置静态资源映射

springboot配置静态资源映射方式是通过 实现的

yaml 复制代码
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)

自定义静态资源映射

可以继承 或者 接口。

建议:

a、无须覆盖原有的静态资源,实现 接口

b、需要覆盖静态资源,继承 类,重写所有资源映射
注意:

a、继承 类时, 配置 和 其他所有实现 接口的的配置都失效

b、实现 接口时,最好通过 #hasMappingForPattern 方法判断一下,否则存在多个同名前缀,启动会报错

配置静态资源映射

创建一个resourceHandlerMapping的bean对象()

#resourceHandlerMapping

→添加静态资源映射并转化为 SimpleUrlHandlerMapping ↑

addResourceHandler 方法添加前缀匹配路径,addResourceLocations 添加本地映射路径。配置之后就保存了一份列表,当获取Mapping时,返回 。

→将配置的静态资源映射转化为Map↑

获取bean之后,对bean对象进行初始化过程

→初始化bean↑

初始化方法,就是判断是否 实现 接口 和 配置initMethod方法名(@Bean的initMethod、xml的init-method属性)

a、实现 接口,调用afterPropertiesSet方法

b、指定initMethod方法名,反射调用方法

初始化方法前后,通过 的applyBeanPostProcessorsBeforeInitialization和applyBeanPostProcessorsAfterInitialization方法分别前后处理

#applyBeanPostProcessorsBeforeInitialization(处理一些列BeanPostProcessor)
#postProcessBeforeInitialization
#invokeAwareInterfaces
#setApplicationContext
#initApplicationContext(org.springframework.context.ApplicationContext)
#initApplicationContext
#registerHandlers
#registerHandler(java.lang.String, java.lang.Object)

→缓存静态资源映射的handler供获取时使用↑

配置跨域

跨域支持配置

访问静态资源过程

获取handler

#doDispatch
#getHandler

#getHandler
#getHandlerInternal
#lookupHandler(java.lang.String, javax.servlet.http.HttpServletRequest)

→获取匹配的前缀路径↑


→获取目标handler↑


→目标handler添加跨域配置↑


→准备执行handler↑

通过handler解析路径

#doDispatch
#handle
#handleRequest
#getResource(java.lang.String, javax.servlet.http.HttpServletRequest, java.util.List<? extends org.springframework.core.io.Resource>)

#createRelative
#createRelativeURL

new java.net.URL#URL(java.net.URL, java.lang.String)

StreamHandler#parseURL

org.springframework.http.converter.AbstractHttpMessageConverter#write

备注:

java.net.#parseURL解析url时,file协议的路径,会截取开头到最后一个"/"位置


*[WebMvcAutoConfiguration]: org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
*[ResourceHttpRequestHandler]: org.springframework.web.servlet.resource.ResourceHttpRequestHandler
*[HttpRequestHandlerAdapter]: org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
*[WebMvcConfigurer]: org.springframework.web.servlet.config.annotation.WebMvcConfigurer
*[DispatcherServlet]: org.springframework.web.servlet.DispatcherServlet
*[ResourceHandlerRegistry]: org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
*[SimpleUrlHandlerMapping]: org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
*[ApplicationObjectSupport]: org.springframework.context.support.ApplicationObjectSupport
*[AbstractHandlerMapping]: org.springframework.web.servlet.handler.AbstractHandlerMapping
*[ApplicationContextAwareProcessor]: org.springframework.context.support.ApplicationContextAwareProcessor
*[URLStreamHandler]: java.net.URLStreamHandler
*[PathResourceResolver]: org.springframework.web.servlet.resource.PathResourceResolver
*[WebMvcConfigurationSupport]: org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport
*[UrlResource]: org.springframework.core.io.UrlResource
*[BeanPostProcessor]: org.springframework.beans.factory.config.BeanPostProcessor
*[CorsRegistry]: org.springframework.web.servlet.config.annotation.CorsRegistry
*[InitializingBean]: org.springframework.beans.factory.InitializingBean
*[AbstractAutowireCapableBeanFactory]: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
*[FileUrlResource]: org.springframework.core.io.FileUrlResource
*[AbstractUrlHandlerMapping]: org.springframework.web.servlet.handler.AbstractUrlHandlerMapping

相关推荐
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚8 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地11 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415911 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风14 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
隔窗听雨眠14 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
z1234567898614 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112315 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python