HandlerMapping(三)AbstractHandlerMethodMapping

分析第一个体系
AbstractHandlerMethodMapping

我们来说说,这边每个类主要的职责

  1. AbstractHandlerMapping 准备上下文环境;提供getHandlerInternal钩子;封装拦截器到HandlerExecutionChain
  2. AbstractUrlHandlerMapping 实现注册handler的方法供子类使用;实现getHandlerInternal,根据子类初始化的配置信息,查找handler
  3. AbstractDetectingUrlHandlerMapping 扫描应用下的Object,迭代后提供钩子方法determineUrlsForHandler由子类决定如何过滤
  4. AbstractControllerUrlHandlerMapping 实现determineUrlsForHandler,添加过滤排除的handler操作(配置文件配置),预留钩子方法buildUrlsForHandler给子类实现;同时判断controller的子类
  5. ControllerBeanNameHandlerMapping 根据bean name生成url

从AbstractUrlHandlerMapping
handler的注册
handler的查找

AbstractDetectingUrlHandlerMapping,
具体做的事情:

  1. 通过覆写initApplicationContext,调用detectHandlers扫描Obejct

  2. 提供钩子方法determineUrlsForHandler给子类根据handler生成url

  3. 调用父类的registerHandler进行注册

AbstractControllerUrlHandlerMapping,
具体做的事情;

  1. 覆写determineUrlsForHandler添加剔除部分类的逻辑,通过配置文件配置的excludedClasses和excludedPackages在这边使用

  2. 判断是否controller的子类

  3. 预留buildUrlsForHandler给子类生成url

ControllerBeanNameHandlerMapping和ControllerClassNameHandlerMapping

BeanNameUrlHandlerMapping 实现determineUrlsForHandler生成url,

基于注解@Controller,@RequestMapping的使用

  1. AbstractHandlerMethodMaping 定义初始化流程,请求时如何映射

      初始化:

        1.1.1 扫描应用下的Object

        1.1.2 预留isHandler钩子方法给子类判断Object是否handler

        1.1.3 迭代扫描每一个handler,找出符合要求的方法,这边判断依然是留给子类实现getMappingForMethod

        1.1.4 注册查找到的处理器,需要确保一个匹配条件RequestMappingInfo只能映射到一个handler

        1.1.5 根据匹配条件获取url,同样的只是定义流程,具体的算法留给子类实现getMappingPathPatterns

      请求request分发处理:

        1.2.1 直接字符串匹配的方式,查找handler 

        1.2.2 匹配条件查找,这边具体的算法交由子类处理getMatchingMapping

        1.2.3 排序并获取最佳匹配handler,这边的排序方式还是子类处理getMappingConmparator

        1.2.4 分别封装匹配到和未匹配到handler的情况

      2. RequestMappingInfoHandlerMapping使用RequestMappingInfo实现匹配条件,RequestMappingInfo的初始化留给子类

        2.1 根据RequestMappingInfo生成url ->getMappingPathPatterns

        2.2 使用匹配条件查找Handler -> getMatchingMapping

        2.3 完成比较器算法 -> getMappingComparator

        2.4 覆写handleMatch,缓存n多信息到request

          注册pattern,最佳匹配的pattern,url中解析出来的参数,url中解析出来的多值参数,mediaType

        2.1.5 覆写handlerNoMatch,最后的挣扎,再尝试匹配一次

      3. RequestMappingHandlerMapping 根据注解@Controller @RequestMapping生成RequestMappingInfo,并校验isHandler

        3.1 覆写afterPropertiesSet,添加文件后缀判断

        3.2 实现isHandler,类上有@Controller @RequestMapping其中一个注解就对

        3.3 解析注解内容,生产RequestMappingInfo实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值