spring mvc RequestMapping 注册源码分析

本文深入分析了Spring MVC中`@RequestMapping`注解的URL映射处理,重点探讨了`AbstractHandlerMethodMapping`类在Servlet环境下的初始化过程。文章详细解释了`RequestCondition`家族类的作用,如`PatternsRequestCondition`、`RequestMethodsRequestCondition`等,并跟随源码跟踪了从`initHandlerMethods`到`processCandidateBean`再到`detectHandlerMethods`的处理流程,揭示了如何将注解信息转换为实际的Handler处理方法并注册到mappingRegistry中。
摘要由CSDN通过智能技术生成

序言:

spring mvc url地址映射处理核心类为org.springframework.web.reactive.result.method.AbstractHandlerMethodMapping(reactive)或org.springframework.web.servlet.handler.AbstractHandlerMethodMapping(servlet),根据不同的启动环境选择不同的AbstractHandlerMethodMapping。由于AbstractHandlerMethodMapping实现了InitializingBean接口,其初始化是通过InitializingBean类中的afterPropertiesSet()回调进行url映射进行处理,向spirng容器中注册一个requestMappingHandlerMappingbean实例存放所有的url映射及其对应的Handler处理方法。

注意:本源码分析是基于spring5.1.13版本及servlet引擎下url注册分析的即:org.springframework.web.servlet.handler.AbstractHandlerMethodMapping

流程图:

准备知识:

RequestCondition:是Spring MVC对一个请求匹配条件的概念建模

-AbstractRequestCondition:RequestCondition的抽象实现类主要是增加了getContent方法,根据不同的实现返回不同的content内容

-CompositeRequestCondition:本身不带任何的匹配条件,只是用于包装其他的RequestCondition进行匹配,封装基础实现,具体的匹配都委托给基础实现类

-ConsumesRequestCondition:对应request的提交内容类型content type,如application/json, text/html

-HeadersRequestCondition:对应http request 的请求头

-ParamsRequestCondition:对应http request parameter

-PatternsRequestCondition:对应url,就是注解value中的配置

-ProducesRequestCondition:指定返回的内容类型的content type,仅当request请求头中的(Accept)类型中包含该指定类型才返回

-RequestMethodsRequestCondition:对应 http method,如GET,POST,PUT,DELETE等

-RequestConditionHolder:用于不知道具体是RequestCondition哪个子类时.自定义的条件,使用的这个进行封装

-RequestMappingInfo:用于包装其他的RequestCondition进行匹配,对应每个方法的@RequestMapping注解,一一对应注解内容与基础实现,使用时一一委托

核心源码详解:

方法位置:org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#initHandlerMethods

private static final String SCOPED_TARGET_NAME_PREFIX = "scopedTarget.";
​
// 扫描applicationContext中的所有bean,并注册处理url相关的方法
protected void initHandlerMethods() {
    // getCandidateBeanNames()就是获取应用下的所有Object类名称集合
    for (String beanName : getCandidateBeanNames()) {// 迭代处理
        if (!beanName.startsWith(SCOPED_TARGET_NAM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值