拦截链和过滤链

昨天在研究MYBATIS的PLUGIN拦截器的时候,发现MYBATIS也有自己的一套拦截链,那么是不是可以跟SPRING MVC的拦截链和SERVLET的FILTER链做下类比。

https://www.jianshu.com/p/8c360568eab2
这篇文件已经分析了MYBATIS的拦截链是基于JDK动态代理包装而成的,虽然看起来像是有一个拦截链在顺序执行,但是实际上是每一个拦截器对目标类都进行一次代理,原对象如果是X,那么第一个拦截器代理后为P(X),第二个代理后P(P(X))......最后返回这样的多重代理对象并执行。所以先配置的拦截器会后执行,因为先配置的先被包装成代理对象。

再来跟SPRING MVC的拦截链和SERVLET的FILTER链做一下对比发现是完全不一样的实现。

SPRING MVC的拦截链是像下面这样的,拦截器都保存在interceptors数组内。


image.png
image.png

再结合DISPATCHERSERVLET的DODISPATCH来看


image.png

事实上SPRING MVC的拦截链不过是在真正的方法执行前、后、视图渲染后调用拦截链里面的三个方法而已,只是基于反射(反射用于根据this.handler来动态获取运行时的类信息)的简单循环调用。跟MYBATIS拦截链的动态代理一点关系也没。

而过滤链的实现是tomcat包里的ApplicationFilterChain类,基于回调的机制,具体查看下面的文章。
http://blog.csdn.net/kingherooo/article/details/39086903

总结

应该说三种链都是责任链设计模式的应用,同时也是利用的AOP的思想,但是实现的机制又各不相同,一个是动态代理、一个是普通循环、一个是函数回调。

你可能感兴趣的:(拦截链和过滤链)