SpringMvc源码分析1
由于疫情影响,在家正好抽时间整理一下SpringMvc相关源码内容。望疫情早点结束,迎暖阳,赏春光!
一. 架构流程
首先,画了一个大概的springmvc处理请求的流程图。
1: 客户端发起请求,请求进入DispatcherServlet
统一处理;
2-3: DispatcherServlet
从内部维护的handlerMappings
列表中查找适合的HandlerMapping
,然后调用其getHandler(request)
方法,返回HandlerExecutionChain
。HandlerExecutionChain
包含了具体的处理器handler
和拦截器列表interceptorList
;
4: 根据得到的handler
从内部维护的handlerAdapters
中获取匹配的HandlerAdapter
;
5-7: 执行HandlerAdapter
的handle(HttpServletRequest request, HttpServletResponse response, Object handler)
方法,返回ModelAndView
;
8-9: 使用从内部维护的viewResolvers
得到具体的视图View
对象;
10-11: 渲染该视图View
,返回给客户端;
二. 接口抽象
我们来关注几个关键的接口
该接口主要就是根据请求,来获取处理器执行链——包括具体的处理器和拦截器。
public interface HandlerMapping {
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
查看一下接口实现图(已删除一些):
之后我们会具体关注
RequestMappingHandlerMapping
。
用来处理具体的handler逻辑,如调用controller里面的代码。
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
查看一下接口实现图:
之后我们会具体关注
RequestMappingHandlerAdapter
这一块内容包括很多,比如参数的绑定,handler方法的执行,返回值的绑定等等。我们先大概了解一下SpringMvc处理请求的流程,接下来我们再查看具体的源码。OK,这一篇先记录到这里。