HandlerMappingIntrospector的initHandlerMappings()具体逻辑如下:

    private static List<HandlerMapping> initHandlerMappings(ApplicationContext applicationContext) {        Map<String, HandlerMapping> beans = BeanFactoryUtils.beansOfTypeIncludingAncestors(                applicationContext, HandlerMapping.class, true, false);        if (!beans.isEmpty()) {            List<HandlerMapping> mappings = new ArrayList<>(beans.values());            AnnotationAwareOrderComparator.sort(mappings);            return Collections.unmodifiableList(mappings);        }        return Collections.unmodifiableList(initFallback(applicationContext));    }


能够看到beans的数量为8,此时HandlerMappingIntrospector.handlerMappings属性值曾经被赋值了。

    private void filterAndRecordMetrics(HttpServletRequest request,            HttpServletResponse response, FilterChain filterChain)            throws IOException, ServletException {        Object handler;        try {            handler = getHandler(request);//1        }        catch (Exception ex) {            logger.debug("Unable to time request", ex);            filterChain.doFilter(request, response);            return;        }        //        filterAndRecordMetrics(request, response, filterChain, handler);    }

第1处获取HandlerMethod;第2处,继续执行doFilter()办法,最终在MockFilterChain.doFilter()执行到DispatcherServlet.doDispatch(request, response);

其中mappedHandler = getHandler(processedRequest);获取HandlerExecutionChain。

Determine handler adapter for the current request.                HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

在下面codwe块中获取适合的HandlerAdapter。

中依据mappedHandler失去HandlerMethod

中根据HandlerMethod利用反射技术去调用指标类,取得返回值。