::: warning 知识点
HandlerMethodArgumentResolver参数解析器 , 最复杂的处理流程之一 , Spring中默认有26种参数解析器 , 来对应完成某种参数的解析工作 。添加过程是 SpringMVC启动实例化后 , 通过 RequestMappingHandlerAdapter类的 afterPropertiesSet方法调用 getDefaultArgumentResolvers添加到 HandlerMethodArgumentResolver解析器中的 。:::
中置过滤器
返回主流程 , 进入 handleInternal方法 , 中置过滤器
所在类:org.springframework.web.servlet.mvc.method.annotation. RequestMappingHandlerAdapter
void applyPostHandle(HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv)throws Exception {// 获取所有拦截器HandlerInterceptor[] interceptors = getInterceptors();if (!ObjectUtils.isEmpty(interceptors)) {for (int i = interceptors.length - 1; i >= 0; i--) {HandlerInterceptor interceptor = interceptors[i];// 分别调用拦截器的 postHandle方法interceptor.postHandle(request, response, this.handler, mv);}}}
::: warning 知识点中置过滤器的调用时序 , 是当 ha.handle 掉完以后 , 也就是 Controller 里面具体方法调用完以后才轮到中置过滤器调用 。可以根据 ModelAndView对象做视图修改 。:::后置过滤器
返回主流程 , 进入 triggerAfterCompletion方法 , 后置过滤器
所在类:org.springframework.web.servlet.mvc.method.annotation. RequestMappingHandlerAdapter
void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, @Nullable Exception ex)throws Exception {HandlerInterceptor[] interceptors = getInterceptors();if (!ObjectUtils.isEmpty(interceptors)) {for (int i = this.interceptorIndex; i >= 0; i--) {HandlerInterceptor interceptor = interceptors[i];try {interceptor.afterCompletion(request, response, this.handler, ex);}catch (Throwable ex2) {logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);}}}}
::: warning 知识点applyPreHandle前置过滤器主要作用是对当前请求做一些初步的验证 , 内部执行顺序是正序遍历 , applyPostHandle 中置过滤器和 triggerAfterCompletion后置过滤器的执行顺序是倒序遍历 , 倒序是因为一但前置过滤器中断(拦截器 preHndle返回 false)那么请求终止 , 根据中断的数组坐标 interceptorIndex , 倒序释放执行已经过滤的的拦截方法 。:::
到此为止 , 主流程结束 , 以上完成了Spring MVC`从请求到处理的一系列过程 , 包括请求方法调用附:常见注解::: danger 常见注解
、参数解析、过滤器调用等 , 接下来就是处理返回值的解析工作 。
- @ModelAttribute:会在调用Controller的每个方法执行前被执行 。
- @RequestBody:用来处理 content-type为 application/json的类型 , 可以是对象 。
- @ResponseBody:一般用于返回 JSON 或 XML 数据 。
- @RequestPart:用来处理 content-type为 multipart/form-data类型的表单提交请求 。
- @ExceptionHandler:用在方法上 , 在运行时有效 , 只捕获当前Controller 中发生的异常 。
- @ControllerAdvice:用在类上 , @ControllerAdvice("com.xx.xx")只对这个包里 面的 Controller 生效 , 并将该类中所有使用了 @ExceptionHandler 注解的方法都应用到请求处理方法上 。
- @Cacheable:若该缓存中没有存储该条记录 , 则执行该方法 , 有则从缓存取 。
- @CacheEvict:将该缓存下的所有记录都清空 。
- @CachePut:总是会执行该方法 , 每次都把返回结果更新进该缓存中 。
- @RequestParam:适用于所有类型的参数;
- @RequestHeader:用于将请求头的信息数据映射到方法参数上。
- @CookieValue:用于将请求的 cookie 数据映射到功能处理方法的参数上 。
- @InitBinder:用于绑定表单数据的注解 。
- @RequestAttribute:用于获取 request作用域 中的数据 。
- @SessionAttribute:用于获取 session作用域中的数据 。
- @PathVariable:获取请求 URL 中的动态参数(路径参数) , 如:"/test4/{id}/{name}" 。
- @MatrixVariable:扩展了URL请求地址 , 多个请求参数可用 , 分开 , 一般用于进行多条件的组合查询 。
- @CrossOrigin:用于不同域名访问 , 解决跨域问题 。
【Spring MVC 核心调用流程】
推荐阅读
- Spring Security 中如何细化权限粒度?
- springcloud微服务架构开发实战:分布式消息总线
- 怎么理解Laravel的核心架构
- 原来这才是Spring Boot使用AOP的正确姿势
- 使用spring cache让我的接口性能瞬间提升了100倍
- Springboot 实现数据库备份还原
- 微服务架构图
- 全网最全一篇数据库MVCC详解,不全你打我
- SpringCloud开发框架入门知识
- SpringMVC:进阶