《看透SpringMVC》第十二章 HandlerMapping

12 HandlerMapping

12.1 AbstractHandlerMapping

  • 保存全部interceptor
  • 爲hanlder添加interceptor

12.2 AbstractUrlHanlderMapping

gethandlerInternal()

經過url找hanlderapp

  • lookeupHandler()ui

    • 獲取直接映射的(this.handlerMap.get(url))this

      • 添加攔截器 PathExposingHandlerInterceptorurl

        • request添加 BEST_MATCHING_PATTERN_ATTRIBUTE.net

        • request添加 PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTEcode

        • request添加 INTROSPECT_TYPE_LEVEL_MAPPING(什麼東西)排序

    • 處理帶模式匹配的接口

      • 獲取匹配的matchingPatterns
      • patherns排序
      • 多個bestMatch,從中提取url模版變量(應用中什麼設置模版變量?)
      • 添加攔截器
        • PathExposingHandlerInterceptor (同上)
        • UriTemplateVariablesHandlerInterceptor

registerHandler()

  • <urlpath, resolvedHanlder> 保存到 this.handlerMap (linkedHashmap)

SimpleUrlHandlerMapping

  • 定義一個urlMap方便配置
  • 自定義的register方法,被initApplicationContext() (WebApplicationObjectSupport方法)調用。

AbstractDetectingUrlHandlerMapping

  • detectHandlersInAncestorContexts 是否從父容器的bean中查找handler

BeanNameUrlHandlerMapping

  • 若是某個bean的名字以「/」開頭則,以他爲url。

12.3 AbstractHandlerMethodMapping

三個Map

  • handlerMethods pattern->handlerMethod
  • urlMap url->pattern 返回多個pattern,選最優的 (MultiValueMap)
  • nameMap 默認類名裏的大寫字母組合 + "#" + 方法名 (通常不用), MvcUriComponentsBuilder 根據name獲取對應的url
    • 使用RequestMappingInfoHandlerMethodMappingNamingStrategy 從handlerMethod中解析出name。

RequestMappingInfo

七種RequestConditionget

initHandlerMethods()

  • 由InitializingBean接口的afterPropertiesSet() 方法調用
  • isHandler() || 判斷handler@Controller 或 @RequestMapping
  • detectHandlerMethods()
    • getMappingForMethod(method, userType) || 找到符合handler的methods
    • registerHandlerMethod() || 註冊handlerMapping(三個map)
      • MappingRegistry 用於註冊
        • 使用ReentrantReadWriteLock (初始化有必要?)

getHandlerInternal()

  • 根據request -> lookupPath
  • lookupPath & Request -> HandlerMethod
  • 若是找到HandlerMethod,返回handlerMethod.createWithResolvedBean() new一個新的實例返回。
相關文章
相關標籤/搜索