设计模式--责任链模式--servletfilter\springMVC Interceptor--Mabatis的优雅实现

在系统设计中,我们又是会遇到一些流程类的需求,比如在一个单据执行前,我们希望有一些校验/数据预处理/环境判定等,而这些单据前的行为未来还可能增加,这种情况下,我们就可以使用责任链模式将这些行为与单据执行本身抽离开来,能够灵活的插拔一些具体的行为。

责任链

责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

Servlet Filter是广为人知的责任链设计。
在这里插入图片描述
如上图所示,在一次客户端的网络请求被我们的业务方法执行之前,Servlet会提供一组Filter(Filter可以被三方实现)将其拦截。
Servlet Fileter的类图如下,FilterChain核心方法为doFilter:
在这里插入图片描述
SpringMVC Intercetor与Servlet Filter是类似的设计,其区别只在于,Interceptor的层次更高,所以拦截的范围比Filter小。

在这里插入图片描述
HandlerInterceptor作为拦截器的接口类,提供(controller)接口前,(controller)接口后的执行逻辑,实际上,这与AOP的用法十分相似。
在这里插入图片描述
nterceptor的实现类也更多,这里只列出了部分,Spring用它实现了Cors处理,注入ConversionService,uri处理,用户角色认证等等。
在这里插入图片描述
HandlerExecutionChain是将Interceptor具体执行的地方,他将所有的Interceptor保存在一个数组中,在每次请求到达时,循环数组以调用里面的每一个拦截器对请求进行封装处理。
在这里插入图片描述
在这里插入图片描述

Mybatis的责任链设计

Mybatis的插件之前已经在【Mybatis源码阅读之八——代理模式与Mybatis插件(pagehelper为例)】(https://blog.csdn.net/qq_35946969/article/details/123204183)中提到过其应用与代理实现,实际上,他也应用了责任链模式。
Mybatis中的Interceptor接口在责任链模式中的位置等同于上述的Web Filter/Interceptor,只不过在Mybatis自身没有其实现子类,这个动作全部放给我们自由实现了。
在这里插入图片描述
InterceptorChain保存了所有拦截器,并通过他们对target(Executor/StatementHandler/ParameterHandler/ResultHandler)进行封装,这里与之前的有所不同,不是直接调用拦截方法,而是对目标类进行增加,这样的话只需要在初始化时对obj进行一次封装,而不需要每次调用都走一遍InterceptorChain。

而增强的方式也正是在前文中提到的JDK代理:
在这里插入图片描述
总结
拦截器本身是一种很好理解的行为型设计模式,可以让我们很方便的在拦截点上做扩展。而Mybatis中的插件提供了一种更优雅的设计——通过责任链模式+代理模式的结合,将扩展行为在初始化阶段融入对象本身。

参考地址:https://blog.csdn.net/qq_35946969/article/details/123204183

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值