springmvc路由机制:RequestMappingHandlerMapping的注入

深入解析SpringMVC工作流程:从核心原理到实战应用 SpringMVC作为Java Web开发的核心框架,其本质是一个基于前端控制器设计模式的请求处理管道。理解其工作原理,关键在于掌握DispatcherServlet如何协调HandlerMapping、HandlerAdapter等核心组件,完成从请求路由到响应渲染的完整生命周期。这一机制不仅解决了传统Servlet开发中业务逻辑与视图渲染耦合的问题,更通过高度可插拔的组件设计,为开发者提供了强大的扩展能力,例如通过自定义HandlerMethodArgumentResolver实现灵活的参数绑定,或利用 阅读详情

1.springmvc中 请求url 什么时候解析的
参考链接1
参考链接2
在springmvc中,如何根据url找到controller以及对应方法,依赖的是HandlerMapping接口的getHandler方法

在Spring MVC框架中,路由机制是实现HTTP请求\到\具体处理器方法\映射的核心。

路由机制实现核心 HandlerMapping

在spring容器中默认注册的HandlerMapping有以下五种:

RequestMappingHandlerMapping
BeanNameUrlHandlerMapping
SimpleUrlHandlerMapping
RouterFunctionMapping
WelcomePageHandlerMapping

1.Spring中RequestMappingHandlerMapping的注入

过程:

1.在springmvc中,使用注解需要在xml了加入注解声明

<!-- 注解扫描 -->
<context:component-scan base-package="com.xiaofan"/>
<!--使用mvc注解声明  -->
<mvc:annotation-driven/>

2.启动web服务器,我用的是tomcat8

3.spring启动,注册BeanDefinition,spring会扫描xml文件,将配置文件中的bean信息注册成BeanDefinition,当发现springmvc的xml配置文件中有annotation-driven标签时,会调用AnnotationDrivenBeanDefinitionParser来解析该标签

@Override
	@Nullable
	public BeanDefinition parse(Element element, ParserContext context) {
		...
		// 前面省略代码
		RootBeanDefinition handlerMappingDef = new RootBeanDefinition(RequestMappingHandlerMapping.class);
		handlerMappingDef.setSource(source);
		handlerMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
		handlerMappingDef.getPropertyValues().add("order", 0);
		handlerMappingDef.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager);

		if (element.hasAttribute("enable-matrix-variables")) {
			Boolean enableMatrixVariables = Boolean.valueOf(element.getAttribute("enable-matrix-variables"));
			handlerMappingDef.getPropertyValues().add("removeSemicolonContent", !enableMatrixVariables);
		}

		configurePathMatchingProperties(handlerMappingDef, element, context);
		// String HANDLER_MAPPING_BEAN_NAME = RequestMappingHandlerMapping.class.getName()
		readerContext.getRegistry().registerBeanDefinition(HANDLER_MAPPING_BEAN_NAME, handlerMappingDef);
		// 后面省略代码
		...
		return null;
	}

4.spring将BeanDefinition通过反射实例化成bean注入到容器中
那么问题来了,如果没有mvc:annotation-driven标签,RequestMappingHandlerMapping还会被注入到spring容器中吗?
答:会的,前提是xml中没有配置任何一个HandlerMapping。
过程如下:

在启动过程中,会调用DispatcherServlet的onRefresh()方法
DispatcherServlet#onRefresh → DispatcherServlet#initStrategies → DispatcherServlet#initHandlerMappings

private void initHandlerMappings(ApplicationContext context) {
		...
		// 前面省略代码
		// 当没有配置任何handlerMapping时,则使用默认的handlerMapping
		if (this.handlerMappings == null) {
			// 从DispatcherServlet.properties拿org.springframework.web.servlet.HandlerMapping
			// 所以默认的有BeanNameUrlHandlerMapping和RequestMappingHandlerMapping
			// 最终还是调用BeanFactory#createBean()生成实例
			this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
			if (logger.isTraceEnabled()) {
				logger.trace("No HandlerMappings declared for servlet '" + getServletName() +
						"': using default strategies from DispatcherServlet.properties");
			}
		}
	}

2.SpringBoot中RequestMappingHandlerMapping的注入

在springboot中的注入,依赖的是springboot的自动装配

过程

1.spring-boot-autoconfigure包下的spring.factories中有WebMvcAutoConfiguration

2.WebMvcAutoConfiguration的内部类EnableWebMvcConfiguration#requestMappingHandlerMapping()

		protected RequestMappingHandlerMapping createRequestMappingHandlerMapping() {
			if (this.mvcRegistrations != null) {
				RequestMappingHandlerMapping mapping = this.mvcRegistrations.getRequestMappingHandlerMapping();
				if (mapping != null) {
					return mapping;
				}
			}
			return super.createRequestMappingHandlerMapping();
		}

3. servlet加载到容器:加载流程

servlet.init()->GenericServlet.init()->HttpServletBean.init->FrameworkServlet.initServletBean()->DisPatchServlet.onRefresh(rootContext)
这个流程用来绑定
handlerMappings
handlerAdapters

5.什么是请求映射?

在SpringMVC中,请求映射是一种将URL请求映射到处理方法(Controller方法)的机制。它使得开发者可以根据URL的不同部分,如路径、请求方法、请求参数等,将请求导航到不同的Controller方法,以执行相应的业务逻辑。

请求映射的主要作用包括:
路由请求:将HTTP请求路由到特定的Controller方法,以执行相关操作。
参数解析:解析URL中的参数,将它们传递给Controller方法进行处理。
请求方法匹配:根据HTTP请求的方法(GET、POST、PUT、DELETE等)来匹配相应的Controller方法。
多视图支持:允许根据请求URL选择不同的视图模板。
RESTful风格支持:支持RESTful风格的URL设计,将URL映射到不同的资源操作。
原文链接:https://blog.youkuaiyun.com/u013749113/article/details/133487716

Spring MVC 与 Spring Boot 的差异到底在哪? 本文深入对比了传统SpringMVC与SpringBoot的核心差异。作者结合开发经验,从配置方式(XML到自动配置)、依赖管理(手动引入到Starter)、部署模式(外置Tomcat到内嵌容器)、外部化配置等方面进行剖析,指出SpringBoot通过自动配置砍掉了80%的模板代码,但同时也可能带来配置冲突等问题。文章强调SpringBoot并非替代SpringMVC,而是其"脚手架",底层仍依赖DispatcherServlet等核心组件。 阅读详情

相关推荐

SpringMVC 解析(四)编程式路由

多数情况下,我们在使用Spring的Controller时,会使用@RequestMapping的形式把请求按照URL路由到指定方法上。Spring还提供了一种编程的方式去实现请求和路由方法之间的路由关系,这种关系在Spring启动时确定,运行过程中不可变。编程式路由和注解式路由可以使用同一个DispatcherServlet。本文会对Spring编程式Endpoint进行介绍,本文主要参考了Spring官方文档。 总览 在Spring MVC编程式路由中一次请求会被一个处理方法进行处理,处理方法在Spri

小明的博客 509

RequestMappingHandlerMapping注入的正确姿势

文章目录简述基本知识点第一种方式:Controller注入第二种方式:从IOC的ApplicationContext里面获取 简述 RequestMappingHandlerMapping是springMVC里面的核心Bean,spring把我们的controller解析成RequestMappingInfo对象,然后再注册进RequestMappingHandlerMapping中,这样请求进来以后就可以根据请求地址调用到Controller类里面了。 Controller毕竟是写死的,在有的情况下我们可

小胖 4937

springboot注解详解(一)Spring Web MVC 注解

【java经典源码】【java手册】【java全栈】【java全栈】【快速开发框架】 【springboot点餐】【P8】【软件资料】【Python1】【Python2】【Python3】 【Python全栈】【爬虫】等等,也有最新考研资料哦 免费获取对应资料。 1、@RequestMapping ================= @RequestMapping注解的主要用途是将Web请求与请求处理类中的方法进行映射。Spring MVC和Spring WebFlux都通过RquestMappingHan

m0_70646989的博客 294

SpringBoot - 根据目录结构自动生成路由前缀

目录前言具体实现配置文件指定基础包自动补全路由前缀处理类自动补全路由前缀配置类测试类测试 前言 本文介绍如何根据目录结构给RequestMapping添加路由前缀(覆盖RequestMappingHandlerMapping中的getMappingForMethod方法,修改其中的Url),如下图的实际访问路径为:/v1/test/test。 具体实现 配置文件指定基础包 application.properties api-package = com.coisini.springbootlearn

Maggieq8324的博客 2477

【SpringBoot 4.x 第61节】Spring MVC 请求处理链路源码解析:DispatcherServlet、HandlerMapping 与 HandlerAdapter!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。本专栏面向 有一定 Java 基础,但尚未系统学习 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,带你从第一个 Hello API 开始,逐步完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 327

【Seurat绘图进阶】从参数调优到美学定制:解锁DimPlot与FeaturePlot的隐藏技巧

本文深入探讨了Seurat包中DimPlot与FeaturePlot的进阶使用技巧,旨在解决单细胞数据可视化中的常见痛点。通过参数调优(如order、shuffle、raster)、颜色美学定制(使用RColorBrewer、viridis配色)以及性能优化(栅格化处理),并结合scCustomize包与patchwork排版,帮助用户将基础图表提升为信息清晰、可直接用于论文发表的出版级可视化结果。

lake5的博客 629

spring MVC之自定义动态路由

简单回顾spring MVC DispatcherServletAutoConfiguration自动注册DispatcherServlet bean DispatcherServletRegistrationConfiguration基于DispatcherServlet bean自动注册Servlet注册器 bean:ServletRegistrationBean JettyEmbeddedWebAppContext设置ServletContextInitializerConfiguration,Se

阿呆的专栏 1910

(最新更新!)2024全国大学生数学建模竞赛(国赛)B题决策优化+鲁棒模型完整建模全解全析

2024全国大学生数学建模竞赛(国赛)B题完整建模全解全析(已更新!)

Yilu264的博客 9417

spring之requestMappingHandlerMapping深入探究

简介 说到springmvc都有过使用过程,也都对格组件流转过程有所认识,但是一直没有特地看看requestMappinHandlerMapping组件,故今天深入探究下这个组件。 分析 先来看看这个组件全景图。 先不分析为何这么设计,先看看组件使用,从使用过程来探究设计原因,首先看看组件初始化。 从这里很容易看清,初始化主要过程就是容器实例化单实例化RequestMappingHandlerMapping时,会触发其InitializingBean...

随笔 1081

Python实战:用MNE-Python从脑电数据中提取P300成分(附完整代码)

本文提供了一份使用MNE-Python从脑电数据中提取P300成分的完整实战指南。通过详细的代码示例,系统讲解了从环境搭建、数据加载、预处理(滤波、分段、伪迹剔除)到P300波形提取、可视化与参数量化的全流程。重点介绍了如何利用零相位滤波和叠加平均技术,从EEG信号中精准分离出反映认知加工的P300事件相关电位,适用于脑机接口与认知神经科学研究。

weixin_29240343的博客 338

tewa-707e光猫超级密码获取方法

这款光猫很魔性,没有WIFI,没有USB接口,没有Telnet,试了很多方法去获取超级密码都不行。解密时可能会报错,可能是文件后面部分不晓得是咋拼接过来的,用AES解密时分组数据有问题。3、这个文件是用AES加密了的,直接打开是乱码,所以得用AES解密,key为16个字节的 x00。打开解出来的文件,然后搜索 telecomadmin,就可以发现超级密码了。参考资料里面的光猫不是同一款,但解密的方法基本相同的。

shaowl111的专栏 1万+

关于Springmvc的路由和参数注入

文章目录SpringBoot目录结构01、构建springboot的项目的准备工作02、使用idea快速构建springboot项目SpringMvc的路由和参数的注入方式01、路由02、关于注解的说明Restful规则02、参数注入 SpringBoot目录结构 01、构建springboot的项目的准备工作 maven3.6/gradle jdk1.8+ idea 02、使用idea快速构建springboot项目 SpringBoot的底层还是spring的ioc的机制来完成的bean的注入

ડUN的博客 991

开箱即用的Platform IO开发平台(包括Arduino,ESP8266,ESP32,STM32)

开箱即用的 Platform IO 离线开发环境,包含(ESP32,ESP32S2,ESP8266,Arduino,STM32)

qq_19703307的博客 755

SpringMVC之RequestMappingHandlerMapping

一句话:这个类主要作用之一是将请求url和对应方法的映射关系保存起来 原理 RequestMappingHandlerMapping注入时机 DispatcherServlet是一个servlet,它的生命周期受容器控制,即容器在servlet实例化后会调用对应的init方法进行初始化(实际是执行父类 org.springframework.web.servlet.HttpServletBean 的init方法) 方法会执行一系列的初始化动作 这里我们分析一下 org.springframework.w

万物皆字节 1718

结构光相移法-多频外差原理与实践

结构光相移法是一种常用的三维形貌测量技术,它通过对投射到目标物体上的结构光进行相位调制和解调,实现对物体表面的三维重建。其中,多频外差原理是结构光相移法的核心原理之一,通过使用不同频率的结构光来实现相位测量,并可以提高测量精度和抗干扰性能。结构光相移法的多频外差原理是一种常用的三维形貌测量技术,它通过使用多个不同频率的结构光进行相位调制和解调,实现对物体表面的三维重建。本文介绍了多频外差原理的原理和实践应用,并提供了相应的Python源代码,希望对读者理解和应用结构光相移法有所帮助。

CodeByte的博客 737

深入浅出块I/O子系统(四)请求处理过程

BIO请求处理的流程 函数scsi_request_fn()代码(摘自文件drivers/scsi/scsi_lib.c) (1)static void scsi_request_fn(struct request_queue *q) (2)int scsi_dispatch_cmd(struct scsi_cmnd *cmd) { host->hostt->queuecommand(host, cmd) } (3)struct sas_internal *i sas_queuec

sinat_37817094的博客 1348

深入解析SpringMVC请求处理流程:从DispatcherServlet到视图渲染

在Java Web开发中,理解请求处理流程是构建稳健应用的基础。SpringMVC作为主流的Web框架,其核心是一个基于前端控制器(DispatcherServlet)的请求处理流水线。该流程遵循清晰的职责链模式,将请求处理分解为映射、适配、执行、渲染等多个阶段,实现了高度的可扩展性。其技术价值在于通过标准化的组件(如HandlerMapping、HandlerAdapter、ViewResolver)解耦了请求路由、业务逻辑执行和视图渲染,使开发者能够专注于业务实现,同时便于进行全局拦截、异常处理和异步优

weixin_33727510的博客 384

深度学习在移动开发中的应用:实时姿态估计实战

我们将使用TensorFlow Lite框架,结合专为移动端优化的MoveNet模型,实现一个能够在主流Android设备上达到30FPS的多人姿态跟踪解决方案,并深入探讨其优化技巧和实际应用场景。特别是3D姿态估计、多人长期跟踪等前沿技术的发展,将进一步推动移动端姿态估计技术的应用深度和广度。在下一篇文章中,我们将探讨深度学习在移动端的另一个创新应用:实时手势识别,包括如何在资源受限的环境中实现复杂手势的实时识别,以及这项技术在AR/VR交互、智能家居控制等场景中的应用。第四部分:典型应用场景实现。

Programming Talk 325

获取SSM项目中所有的URL

1、在springmvc配置加上两个bean:<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <bean class="org.springframework.web.servlet.mvc.method.annotation.Reques

A_Kid 3028

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

springmvc源码分析之找到Controller

前言 前面我们简单地分析了两个过程,本文将会来介绍请求过来是如何找到对应的Controller中的方法的。 概述 在分析之前,我们先记住几个类名,HandlerMapping接口,RequestMapingHandlerMapping类,HandlerMethod类。 HandlerMapping接口:请求和处理方法的映射接口,提供了getHandler方法,我们可以通...

bangchenglan1860的博客 323

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

spring mvc 基于注解 配置默认 handlermapping

spring mvc 是类似于 Struts 的框架。他们都有一个最主要的功能就是URL路由。URL路由能将请求与响应请求处理逻辑的类(在Struts中即是action,在spring mvc 中即是 controller )映射起来。抛开其他的功能,spring mvc 要比 Struts 在URL路由功能上灵活很多。比如要实现 RESTful,如果用 Struts ,需要安装 一些插件,而...

peng128的专栏 186

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HandlerMapping之RequestMappingHandlerMapping作用详解

上回我们知道HandlerMapping是用来寻找Handler的,并不与Handler的类型或者实现绑定,而是根据需要定义的。那么为什么要单独给@RequestMapping实现一个HandlerMapping?这次咱们就来专门看看这个RequestMappingHandlerMapping。由于@RequestMapping支持灵活的请求匹配条件,而不只是简单的路径,只能开发出RequestMappingHandlerMapping进行支持。

男神的专栏 2590

深入理解Spring MVC:从原理到动态URL路由实践

Spring MVC通过动态URL映射实现灵活路由控制。文章首先解析了Spring MVC的核心原理,重点介绍DispatcherServlet的请求处理流程及关键组件。随后深入探讨RequestMappingHandlerMapping的动态注册机制,提出通过registerMapping方法实现运行时URL绑定。

weixin_42613131的博客 765

SpringBoot中动态注册接口

spring动态注册接口

pp_lan的博客 2599

spring接口版本控制方案及RequestMappingHandlerMapping接口介绍

RequestMappingHandlerMapping支持多种请求映射的方式,如基于URL路径的请求映射、基于请求方法的请求映射、基于请求头的请求映射等。通过灵活的配置和扩展,可以实现请求的路由、请求的参数解析和数据绑定,以及接口版本控制等功能。RequestMappingHandlerMapping可以处理多种类型的处理器,例如带有@Controller或@RestController注解的类,实现了Controller接口的类,以及其他自定义的处理器类型。在Spring MVC中,可以通过自定义。

码到三十五 1202

SpringMVC原理

spring mvc源码解析

onePlus5T的博客 1134
上一篇: mysql8032安装
下一篇: springmvc路由机制:请求地址->RequestMappingInfo
和月明
博客等级 码龄6年 214粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值