码迷,mamicode.com
首页 > 编程语言 > 详细

SpringMVC(四):什么是ServletInvocableHandlerMethod

时间:2018-03-22 13:40:00      阅读:814      评论:0      收藏:0      [点我收藏+]

标签:创建   throw   manager   container   started   实例化   debug   put   stc   

技术分享图片

 

一、概述SpringMVC 处理请求的过程

1. DispatchServlet 

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception 相关代码
                // Determine handler adapter for the current request.
                HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());// Actually invoke the handler.
                mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

 

2. 什么是HandlerAdapter

 技术分享图片

在以前的文章中,已经说过RequestMappingHandlerAdapter是处理输入输出的关键点

HandlerAdapter的handle()会调用

  RequestMappingHandlerAdapter的invokeHandlerMethod()

    protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
            HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {

        ServletWebRequest webRequest = new ServletWebRequest(request, response);
        try {
            WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
            ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
        //创建ServletInvocableHandlerMethod
            ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
            invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
            invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
            invocableMethod.setDataBinderFactory(binderFactory);
            invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);

            ModelAndViewContainer mavContainer = new ModelAndViewContainer();
            mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
            modelFactory.initModel(webRequest, mavContainer, invocableMethod);
            mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);

            AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
            asyncWebRequest.setTimeout(this.asyncRequestTimeout);

            WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
            asyncManager.setTaskExecutor(this.taskExecutor);
            asyncManager.setAsyncWebRequest(asyncWebRequest);
            asyncManager.registerCallableInterceptors(this.callableInterceptors);
            asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);

            if (asyncManager.hasConcurrentResult()) {
                Object result = asyncManager.getConcurrentResult();
                mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
                asyncManager.clearConcurrentResult();
                if (logger.isDebugEnabled()) {
                    logger.debug("Found concurrent result value [" + result + "]");
                }
                invocableMethod = invocableMethod.wrapConcurrentResult(result);
            }
            //调用
            invocableMethod.invokeAndHandle(webRequest, mavContainer);
            if (asyncManager.isConcurrentHandlingStarted()) {
                return null;
            }

            return getModelAndView(mavContainer, modelFactory, webRequest);
        }
        finally {
            webRequest.requestCompleted();
        }
    }

 

 

3.

技术分享图片

 

4.  疑问:这些HandlerMethond是什么时候载入系统的

系统实例化的时候执行registerHandlerMethod()方法

技术分享图片

 

SpringMVC(四):什么是ServletInvocableHandlerMethod

标签:创建   throw   manager   container   started   实例化   debug   put   stc   

原文地址:https://www.cnblogs.com/yuyutianxia/p/8622923.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!