【12.MyBatis源码剖析与架构实战】MyBatis与设计模式-10. 责任链模式
MyBatis 与责任链模式(Chain of Responsibility Pattern)详解
责任链模式是一种行为型设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。在 MyBatis 中,插件(Interceptor)机制是责任链模式的典型应用:通过InterceptorChain将多个Interceptor串联起来,在核心对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)的方法调用前后执行自定义逻辑,并且可以通过invocation.proceed()控制是否继续执行下一个插件或目标方法。
一、责任链模式概述
意图:使多个对象都有机会处理请求,避免请求的发送者与接收者之间的耦合关系。将这些对象串成一条链,并沿着链传递请求,直到有一个对象处理它为止。
参与者:
- Handler:定义处理请求的接口,通常持有对下一个处理者的引用。
- ConcreteHandler:实现处理请求的方法,若能处理则处理,否则将请求转发给后继者。
在 MyBatis 中,每个Interceptor就是一个处理器,InterceptorChain维护处理器列表,并通过动态代理将处理器串联起来,形成调用链。调用链的执行顺序遵循**后进先出(LIFO)**原则。
二、MyBatis 中的责任链:插件机制
MyBatis 允许拦截四大核心接口的方法调用:
Executor(执行器)StatementHandler(语句处理器)ParameterHandler(参数处理器)ResultSetHandler(结果集处理器)
通过实现Interceptor接口并使用@Intercepts注解声明拦截的目标方法,开发者可以编写插件。MyBatis 在初始化时将插件添加到InterceptorChain,在创建核心对象时,通过InterceptorChain.pluginAll(target)为目标对象生成多层代理对象,这些代理对象形成了一条责任链。
