序言:
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容器中注册一个requestMappingHandlerMapping
bean实例存放所有的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