springmvc 路径注册MappingRegistry

之前一直好奇为什么我们写上@RequestMapping就能访问我们的程序接口,研究源码发现是spring在启动的时候就已经把我们的所有包含@RequestMapping的类和方法上的路径拼接好放在一个map缓存中,后面我们通过请求url的时候会直接从缓存中获取,然后匹配,今天就带大家看一下springmvc是如何将我们写的@RequestMapping上的路径注册给程序并放入缓存中的,话不多说,上源码。

spring在启动的时候会初始化AbstractHandlerMethodMapping类,他实现了InitializingBean的接口
在这里插入图片描述
所以在初始化的时候会调用afterPropertiesSet这个方法,然后调用initHandlerMethods方法在这里插入图片描述
扫描 ApplicationContext 中的 bean,检测和注册处理程序方法。
在这里插入图片描述
getCandidateBeanNames这个方法会获取所有候选的bean名称,也就是容器加载的时候加载的所有bean
在这里插入图片描述
然后遍历所有的bean,执行processCandidateBean这个方法,也就是处理候选的bean,点进这个方法
在这里插入图片描述
我们会看到在if判断中有isHandler的方法,具体实现类在RequestMappingHandlerMapping类中,点进去发现
在这里插入图片描述
这块会有两个判断,一个是判断类上有没有标注@Controller注解,另一个是判断有没有标注@RequestMapping注解,看到这是不是豁然开朗,这就是为什么我们平时标注这两个注解springmvc就会找到我们的路径的原因,继续往下看

如果标了这两个任意一个注解,就会进入detectHandlerMethods方法,追进去我们看
在这里插入图片描述
其中selectMethods这个方法是查询我们类里面的所有方法。
getMappingForMethod是获取方法的映射,在这一方法中会将类上的uri和方法上的uri拼接起来,并封装一个RequestMappingInfo对象返回
在这里插入图片描述
最后会遍历methods这个属性,调用registerHandlerMethod方法,具体在RequestMappingHandlerMapping类中,注册处理程序方法
在这里插入图片描述
在这里插入图片描述
调用父类方法
在这里插入图片描述
然后执行register注册方法,在这个方法中我们会发现有一个this.registry.put()的操作
在这里插入图片描述
这个register对象,点上去发现时一个Map对象,由此可得出,我们所有的路径uri包装对象都会存放在这个map对象中,等我们在真正执行mvc请求时,就会从这个里面获取有没有我们请求的路径
在这里插入图片描述

在这里插入图片描述
在这个registry对象中,我们会发现它存储了我们所有请求的请求方式,uri,以及具体的方法所在的类路径等等信息。

至此,我们就将spring在启动过程中将所有的uri加载放入缓存的这一步骤分析完成,感兴趣的朋友可以自己断点看一下,后续有时间会更新一下mvc具体的执行流程。

谢谢大家,有问题可以在下方留言。
原创不易,多多点赞~~~~

Spring MVC的路径映射主要通过@RequestMapping注解来实现。在Spring MVC中,可以使用多种注解来定义路径映射规则,其中包括@Controller、@RequestMapping、@GetMapping等。 @Controller注解用于标识一个类是控制器,可以处理请求并返回相应的结果。在控制器类中,可以使用@RequestMapping注解来定义请求路径的映射规则。例如,在示例中的HelloController类中,使用@RequestMapping("/user")注解来指定该控制器的基础请求路径为"/user"。 @RequestMapping注解除了可以定义类级别的请求路径外,还可以在方法级别上定义具体的请求路径。例如,在HelloController类中,使用@RequestMapping(path = "/hello", method = {RequestMethod.POST})注解来定义了一个请求路径为"/hello"且请求方法为POST的方法。 另外,Spring MVC还提供了一种简化的路径映射注解,如@GetMapping注解。这些注解是@RequestMapping注解的缩写形式,用于定义特定请求方法的映射规则。例如,@GetMapping注解可以替代@RequestMapping注解中的method参数为RequestMethod.GET,用于定义GET请求的路径映射规则。 综上所述,Spring MVC的路径映射可以通过@Controller、@RequestMapping、@GetMapping等注解来定义,而具体的映射规则可以根据实际需求来选择不同的注解进行配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringMVC 路径映射](https://blog.csdn.net/qq_44713454/article/details/108145304)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [spring mvc路径映射](https://blog.csdn.net/sunyaoxjtu/article/details/102832923)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值