随笔记录-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

相关推荐
逻辑驱动的ken10 分钟前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
無限進步D3 小时前
Java 面向对象高级 接口
java·开发语言
逸Y 仙X4 小时前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
二哈赛车手4 小时前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
薪火铺子4 小时前
Redis 缓存三大问题与解决方案
redis·spring·缓存
AC赳赳老秦4 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
两年半的个人练习生^_^4 小时前
Java日志框架和使用、日志记录规范
java·开发语言·开发规范