全面解析Interceptor拦截器 以翻阅源码的形式带领你们解析
执行流程图 拦截器全部返回true :
执行流程图 拦截器返回false :
入口点 还是我们熟知的前端控制器DispatchServlet,找里面的doDispatch方法
记住 翻阅源码一定不要从头开始看 人会傻的 , 我把重点以断点的形式标出来了:
简介
我们都知道 在Spring的环境中 我们要实现拦截器Interceptor可以通过配置类的方式或者xml文件区配置MVC:interceptor ,并且自定义类需要实现HanblerInterceptor接口并重写里面的三个方法
断点1 : 点进去看内部方法 其内部就是调用了perHandle
mappedHanbler是HandlerExecutionChain类型的 可以在源码第一张图看到哟(断点下方定义的)
可以发现该HandlerExecutionChain类中内部维护了一个Object类型的 handler 跟一个集合
不妨直接告诉大家 handler就是目标方法 也就是处理器方法
维护的这么一个集合 就是 对应的interceptor拦截器 因为拦截器可以有多个所有使用的集合
在回到方法内部 发现内部去拦截器集合进行一个遍历,每一个拦截器对象都调用preHanble方法 , 发现false就停止遍历 , 是不是就对应了上面执行流程图的第一行perHanble执行流程 一旦拦截器返回false ,目标方法不会执行 , 对应的postHanble也不会执行,直接执行对应返回true的拦截器中的afterCompletion方法。
断点二: 其实内部就是调用了目标方法,这里也就不过多bb了。
断点三: 则是在preHandle与目标方法完且通过时,执行, 来到方法内部可以看见:
是对我们的拦截器集合进行了一个倒序遍历 在依次执行postHandle方法 , 这也就应验了 流程图中postHandle是从右往左执行。
在看第四个断点 : 找到方法内部的断点这一行,
进入方法内部在看,发现又是一个倒序遍历拦截器,也就可以应验afterCompertion方法也是倒着执行的了
温馨提示 :
目标方法 = 处理器方法 也就是我们Controller层中的某一个方法
再次提醒, 翻阅源码一定一定不能从头开始看 就看自己见过的,自己懂的。