当前位置: 首页 > article >正文

几句话分析org.springframework.web.servlet.HandlerMapping体系机构

 

                                 简介

    映射器的作用就是解析出来url和handler的关系,并且保存这样的关系,在每次请求到来时,查找这个handler。handler并未有明确的要求,但是从spring原本实现上看,handler主要有对象级别和方法级别两种.

     {@link HandlerMapping}为高级接口定义,所有的HandlerMapping都是基于它实现的。但是它仅仅只是定义了,如何通过Request查找对应的HandlerExecutionChain对象,并未定义如何注册url和handler的关系。

        {@link HandlerMapping}有两个实现类,分别是从对象级别以及方法级别上查找url和handler的映射关系,这两个实现类分别是:

  1.  AbstractUrlHandlerMapping:从对象级别定义url和handler的映射关系,它的内部是通过一个map来维护这个关系的。
  2. AbstractHandlerMethodMapping:从方法级别定义url和handler的映射关系,它的内部是通过一个注册中心来维护这个关系的,即{@link AbstractHandlerMethodMapping.MappingRegistry},并且它支持的是{@link org.springframework.web.bind.annotation.RequestMapping}的注解

AbstractUrlHandlerMapping

它处理的handler是一个bean,但这个bean又分为实现了特定接口的bean和不指定特定实现的bean
  1. 自己指定url和handler关系映射的,即通过prop指定,其为{@link SimpleUrlHandlerMapping}
  2.  通过bean本身去解析bean的url和handler关系的,即{@link AbstractDetectingUrlHandlerMapping}

AbstractDetectingUrlHandlerMapping

对于通过bean本身去解析bean的url和handler关系的类,该类有分为两种:

  1. 第一种是通过bean的名称去解析,而bean的名称就是我们定义bean的时候制定的。即
    {@link BeanNameUrlHandlerMapping}
  2. 第二种则是通过实现了特定接口或者注解的bean去解析的bean,即
    {@link AbstractControllerUrlHandlerMapping}
AbstractControllerUrlHandlerMapping
该类通过,查找固定实现了{@link Controller}接口或者 {@link org.springframework.stereotype.Controller} 的bean来实现bena的关系映射,他又进一步分为三种查找关系
  1. bean的name是一个url结构的。对应的实现类为{@link ControllerBeanNameHandlerMapping},它与BeanNameUrlHandlerMapping的区别是,他必须实现实现了{@link Controller}接口或者 {@link org.springframework.stereotype.Controller},并且他还支持前缀、后缀适配、过滤适配等。
  2. bean的包路径形成url结构的,对应的实现类为{@link ControllerClassNameHandlerMapping},它的作用,就是讲bean所在的包当做url的一部分,进行url匹配。
  3. bean上注解了{@link org.springframework.web.bind.annotation.RequestMapping}的,目前该方法即将淘汰,使用AbstractHandlerMethodMapping的进行替换和支持。这个方法与AbstractHandlerMethodMapping的区别之处在于,他解析结果是对象级别的,比如你一个bean中注解了多个requestmapping,它的内部存的是一个requestmapping的url与这个bean的映射关系,而AbstractHandlerMethodMapping则是存了一个requestmapping与这个方法级别的映射关系


http://www.kler.cn/a/464609.html

相关文章:

  • 我的博客年度之旅:感恩、成长与展望
  • Android 模拟器系统镜像选择指南
  • 4. C语言 变量
  • C# 标准数字格式字符串
  • springboot集成阿里云短信服务
  • 《从入门到精通:蓝桥杯编程大赛知识点全攻略》(一)-递归实现指数型枚举、递归实现排列型枚举
  • 在C#中,如何使用委托实现事件处理?
  • 计算机网络 (20)高速以太网
  • 【QT】:QT图形化界面概述
  • 解读一个新建的 Spring Boot 项目
  • 若依引入腾讯地图
  • FastDeploy部署paddlecls分类模型(windows)
  • element-plus大版本一样,但是小版本不一样导致页面出bug
  • 人工智能知识分享第六天-机器学习_​逻辑回归(Logistic Regression)
  • @Data
  • 关于Flutter应用国际化语言的设置
  • 复合机器人正以其高效、精准、灵活的特点,逐渐在汽车装配线上崭露头角
  • 使用XGBoost算法进行机器学习任务:从理论到实践
  • 树莓派之旅-在wsl-x86-64 上进行树莓派的交叉编译
  • 戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?
  • pyspark执行group by操作
  • df.drop()
  • 【剪映绿化版】剪映免费绿色版,全部功能可用
  • Centos7中安装X11vnc
  • 基于 GPUTasker 的 GPU 使用情况钉钉推送机器人实现
  • 基于Springboot + vue实现的校园周边美食探索及分享平台