alt

  1. 接收请求
  • org.springframework.web.servlet.FrameworkServlet#initContextHolders
  • RequestContextHolder就是利用ThreadLocal,将request放到线程关联的ThreadLocal中
private void initContextHolders(HttpServletRequest request,
			@Nullable LocaleContext localeContext, @Nullable RequestAttributes requestAttributes) {

		if (localeContext != null) {
			LocaleContextHolder.setLocaleContext(localeContext, this.threadContextInheritable);
		}
		if (requestAttributes != null) {
			RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable);
		}
	}

RequestContextHolder 是springmvc的工具类,持有上下文request的容器,从而使得可以在任何java代码处获取request对象

寻找HandlerMapping,关联HandlerMethod(@Controller)

  • 确定这个请求需要被哪个@Controller的哪个方法处理
  1. 生成处理器执行链
{@link org.springframework.web.servlet.DispatcherServlet#doDispatch}


				// 生成处理器执行链   Determine handler for the current request.
				mappedHandler = getHandler(processedRequest);
				if (mappedHandler == null) {
					noHandlerFound(processedRequest, response);
					return;
				}

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

				// Process last-modified header, if supported by the handler.
				String method = request.getMethod();
				boolean isGet = HttpMethod.GET.matches(method);
				

获得到mappedHandler

  • 位于处理器链末端的是一个HandlerMethod,DispatcherServlet通过handlerAdapter适配器对InterceptorList和HandlerMethod进行封装,
  • 并按照统一的适配器接口对HandlerAdapter处理方法进行调用

处理器适配

  • 根据HandlerMethod寻找HandlerAdapter

  • HandlerAdatper作用:

    • 帮助DispatcherServlet调用请求处理器(HandlerMethod),无需关注其中实际的调用细节。
    • 比如,调用注解实现的@Controller需要解析其关联的注解,
    • 比如请求参数绑定,类型转换,校验等,
    • HandlerAdapter的主要目的是为了屏蔽与DispatcherServlet之间的诸多细节,下面的 都是其作用的体现

handlerMethod转换

public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
		implements BeanFactoryAware, InitializingBean {
    
    // 其使用一个Composite组合对象来装载多个HandlerMethodArgumentResolver
    private HandlerMethodArgumentResolverComposite argumentResolvers;
}

  • 其使用一个Composite组合对象来装载多个HandlerMethodArgumentResolver

方法参数解析器:HandlerMethodArgumentResolver

  1. 将请求参数映射到比如@RequestParam、@PathVariable以及@RequestBody
  2. 其也是有多个,哪个支持就处理
public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {
    
    private final List<HandlerMethodArgumentResolver> argumentResolvers = new LinkedList<>();
}

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#invokeHandlerMethod

通过HandlerMethodArgumentResolver来解析方法参数