目录
SpringMVC中的的HandlerExecutionChain
Tomcat处理Serlvet的ApplicationFilterChain链
what什么是责任链模式
Gof定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
HeadFirst定义:当想让一个以上的对象有机会处理某个请求的时候,就使用责任链模式。
why为什么需要责任链模式
通过责任链模式,我们可以爲某个请求创建一个对象链。每个对象依次检查该顺序,并对其进行处理,或者将其传给链中的下一个对象。
在很多复杂的框架中,一个请求从入到出比如会经过很多的步骤和环节,而有的步骤其实内部处理的输入输出都类似,只是逻辑不一样而已,因此,责任链模式再适合不过了。
责任链的核心是这个链,也就是说在一个链上面有相似的请求模式,可以想象成生产汽车的流水加工线,假设需要生产特斯拉,汽车有1w个零件,每个零件就是一个链,一个链处理一件事情,有的往车上加轮胎,有的往车上加引擎,最终一辆汽车就产生了。如果没有责任链,那么会出现一个问题是所有的事情都在一起执行,而这可能是不同的团队不同车间做的事情。
how如何实现责任链模式
职责链模式主要包含以下角色。
- 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
- 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
责任链模式的本质是解耦请求与处理,让请求在处理链中能进行传递与被处理;理解责任链模式应当理解其模式,而不是其具体实现。责任链模式的独到之处是将其节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动起来。
责任链模式的结构图
开源框架经典案例
SpringMVC中的的HandlerExecutionChain
对Serlvet了解的同学会知道,Listener、Filter、Intercetor是几个常用组件,这里具体作用我就不详细描述了,基本都是主逻辑的辅助组件。我们重点关注SpringMVC中有interceptor、SpringMvc在处理一个request的时候,都会先走一个HandlerExecutionChain,这个执行链里面是由很多个Interceptor组成的,而每一个Interceptor都有几个核心方法,分别是preHandle、postHandle、afterCompletion。
所有注册了的Interceptor都会被加载到HandlerExecutionChain中,因此我们也可以自定义拦截器做一些通用操作,比如线程变量的初始化、日志的打印、参数的校验等等。
先看一下HandlerExecutionChain的结构,其中数组interceptors和列表interceptorList的区别是什么,这里我认为是为了更好的构建interceptors,因为数组操作没有interceptorList方便,因为在外部只用到了interceptors。
/**
Hanlder处理链,由handler interceptor组成
* Handler execution chain, consisting of handler object and any handler interceptors.
* Returned by HandlerMapping's {@link HandlerMapping#getHandler} method.
*
* @author Juergen Hoeller
* @since 20.06.2003
* @see HandlerInterceptor
*/
public class HandlerExecutionChain {
private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class);
private final Object handler;
pri