029:DispatcherServlet源码分析
1 SpringMVC深度源码分析内容介绍
课程内容:
1.DispatcherServlet与Servlet的关系
2.DispatcherServlet底层源码分析
3.SpringMVC拦截器源代码分析
4.SpringMVC控制对象初始化的流程
2 DispatcherServlet类的继承关系
DispatcherServlet是SpringMVC中非常核心的类(一个Servlet类),包装了url到请求方法的映射关系,客户端所有的请求都会转发到DispatcherServlet,最终能够执行到SpringMVC中定义的请求方法。
源代码分析:
- 类的继承关系
DispatcherServlet继承FrameworkServlet继承HttpServlet - 流程:
HttpServlet Service →判断请求如果Get请求→FrameworkServlet DoGet方法→DispatcherServlet doService方法→doDispatch()
3 SpringMVC深度源码分析01
- 调用getHandler()通过url路径地址查询到具体的控制请求的方法,如果没有找到情况下直接返回404。Handler对应的就是控制层类方法。
底层有一个SpringMVC的容器,存放当前jvm中所有url映射的路径对应的请求的方法存放到Map集合。Key:url value:请求方法
SpringMVC映射路径的容器在什么时候被创建呢?
Servlet在调用我们的init的方法被创建的。
4 SpringMVC源码之定位Handler原理
Handler–请求控制层,HandlerMethod–请求具体方法;
HandlerMapping–当前所有的url路径的映射的集合、拦截器等,装配整个SpringMVC所有的信息。
为什么会存在有多个handlerMapping?
注解配置/Xml配置SpringMVC等,一个handler对应一个渠道来源。
5 SpringMVC拦截器源码分析
进入拦截器前置方法
DispatcherServlet源码流程分析
- 执行doDispatch;
- 调用getHandler方法获取请求目标的方法,也就是请求url映射路径对应的控制层具体的方法;
handlerMappings的作用查找控制器位置,比如xml和注解方式。 - 调用getHandlerAdapter获取控制层适配器 RequestMappingHandlerAdapter;
- 执行拦截器前置方法 preHandle(),如果返回为true的话继续执行;
- 执行实际请求目标方法,返回modeAndView对象;
- 执行拦截器PostHandle()方法;
- 设置渲染视图层内容;
- 执行拦截器afterCompletion方法。
6 SpringMVC路径映射初始化原理
SpringMVC控制层容器初始化
- HttpServletBean → init ()方法
- FrameworkServlet initServletBean方法 → initWebApplicationContext();
- DispatcherServlet onRefresh方法 → initStrategies()方法
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context); //初始化上传文件解析器(或者是多部分请求解析器)
initLocaleResolver(context);//初始化本地化解析器
initThemeResolver(context);//初始化主题解析器
initHandlerMappings(context);//初始化处理器映射器
initHandlerAdapters(context);//初始化处理器适配器
initHandlerExceptionResolvers(context);//初始化处理器异常解析器
initRequestToViewNameTranslator(context);//初始化请求到视图名翻译器
initViewResolvers(context);//初始化视图解析器
initFlashMapManager(context);//初始化重定向数据管理器
}