- 接收请求
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的哪个方法处理
- 生成处理器执行链
{@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
方法参数解析器:- 将请求参数映射到比如
@RequestParam、@PathVariable以及@RequestBody
- 其也是有多个,哪个支持就处理
public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {
private final List<HandlerMethodArgumentResolver> argumentResolvers = new LinkedList<>();
}
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#invokeHandlerMethod