SpringMVC 之DispatchServlet 原理梳理
DispatchServlet
主要梳理了一下源码中几个方法
启动时:onRefresh()
初始化各种配置 initStrategies()
this.initMultipartResolver(context);
this.initLocaleResolver(context);
this.initThemeResolver(context);
this.initHandlerMappings(context);
this.initHandlerAdapters(context);
this.initHandlerExceptionResolvers(context);
this.initRequestToViewNameTranslator(context);
this.initViewResolvers(context);
this.initFlashMapManager(context);
请求时:doService()
doDispatch()
根据请求选择合适的HandlerExecutionChain mappedHandler = this.getHandler(processedRequest);
遍历所有初始化的HanderMapping.getHandler()
SimpleUrlHanderMapping
PropertySourcedRequestMappinglHanderMapping
RequestMappinglHanderMapping
父类:AbstractHandlerMethodMapping .getHandlerInternal(request)
根据请求路径 lookupPath 获取对应的controller的方法 lookupHandlerMethod(String lookupPath, HttpServletRequest request)
其实初始化的时候就已经把RequestMap储存到集合中了 所以第一步先根据key找这个集合 this.urlLookup 获取RequestMappingInfo
如果没有找到,再遍历这个进行匹配 this.mappingLookup 可以匹配到具体的HandMethod
- 匹配规则:RequestMappingInfo .getMatchingCondition(HttpServletRequest request)
BeanNameHanderMapping
SimpleUrlHanderMapping 居然有第二个?
WelcomePageHanderMapping
再根据hander选择适配器 HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
执行拦截器HandlerInterceptor前置方法 mappedHandler.applyPreHandle(processedRequest, response)
通过适配器执行具体内容 mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
HttpRequestHandlerAdapter:
RequestMappingHandlerAdapter:
会调用该方法 handleInternal()
执行具体的方法invokeHandlerMethod mav = this.invokeHandlerMethod(request, response, handlerMethod);
ServletInvocableHandlerMethod.class invocableMethod.invokeAndHandle(webRequest, mavContainer);
InvocableHandlerMethod.class Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
获取请求参数 Object[] args = this.getMethodArgumentValues(request, mavContainer, providedArgs);
会先从privatedArgs中取看看,但是一般都是取不到的 args[i] = findProvidedArgument(parameter, providedArgs);
args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);
* HandlerMethodArgumentResolverComposite.class resolveArgument() * 根据参数从this.argumentResolvers中指定解析器 HandlerMethodArgumentResolver resolver = getArgumentResolver(parameter); * 使用解析指定解析器 获取参数 resolver.resolveArgument(parameter, mavContainer, webRequest, binderFactory);
2. 调用执行方法 this.doInvoke(args);
SimpleControllerHandlerAdapter
一般不用被初始化,只有上面三个 SimpleServletHandlerAdapter: servlet时使用
执行拦截器HandlerInterceptor后置方法 mappedHandler.applyPostHandle(processedRequest, response, mv);
原文地址:https://www.cnblogs.com/thinline/p/11692354.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 海康相机SDK联合c++标定
- 开发一个Node命令行小玩具全过程--高颜统计工具
- 消息未读之点不完的小红点(Node+Websocket)
- pkg版本规范管理自动化最佳实践
- 数据库驱动问题:MySQLNonTransientConnectionException
- 喜大普奔,es2019登场
- [译] Object.assign 和 Object Spread 之争, 用谁?
- 急速 debug 实战二(浏览器 - 调试线上篇)
- via the 'serverTimezone' configuration property
- 急速 debug 实战一(浏览器-基础篇)
- MongoDB系列一: Replica Set 集群搭建实战
- 函数式编程看React Hooks(一)简单React Hooks实现
- 函数式编程看React Hooks(二)事件绑定副作用深度剖析
- Vue 开发必须知道的 36 个技巧【近1W字】
- 吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧《上》