“Mybatis源码分析之插件模块”是一篇深入剖析Mybatis插件模块的文章。总的来说,Mybatis插件模块的实现流程可以概括为下面四个核心类别:Interceptor、InterceptorChain、Plugin和Invocation。
- Interceptor接口:插件必须实现的接口,提供了intercept()方法以便拦截Mybatis的方法调用。
- InterceptorChain类:插件组的执行链,它保存了所有Interceptor的引用,并且提供了proceed()方法以便递归调用Interceptor的intercept()方法。
- Plugin类:是拦截器的代理类,它封装了拦截器实例和拦截器链,实现了Mybatis插件的动态代理。
- Invocation接口:是插件拦截器的执行实例,包含了Mybatis的Mapper Method和参数,通过它可以动态调用真实的Mapper Method,同时也提供了proceed()方法,以便递归调用Interceptor的intercept()方法。
下面就分别来看几个段落,介绍每个类别的细节:
Interceptor接口的实现
Interceptor是插件必须实现的接口,它提供了intercept()方法以便拦截Mybatis的方法调用。在此我们可以扩展Interceptor接口,实现自己的拦截逻辑。
public interface Interceptor {
Object intercept(Invocation invocation) throws Throwable;
}
InterceptorChain类的实现
InterceptorChain是插件组的执行链,它保存了所有Interceptor的引用,并且提供了proceed()方法以便递归调用Interceptor的intercept()方法。在此我们可以实现InterceptorChain,把所有拦截器串联起来,实现拦截器链。
public class InterceptorChain {
private final List<Interceptor> interceptors = new LinkedList<>();
private int index = 0;
public Object proceed() throws Throwable {
if (index < interceptors.size()) {
return interceptors.get(index++).intercept(this);
}
return null;
}
}
Plugin类的实现
Plugin是拦截器的代理类,它封装了拦截器实例和拦截器链,实现了Mybatis插件的动态代理。在此我们可以实现Plugin,代理Mapper的方法实现。
@Intercepts(@Signature(
type = StatementHandler.class,
method = "prepare",
args = {Connection.class, Integer.class})
)
public class MyPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
final StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
final MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
final MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
// do something with MappedStatement
return invocation.proceed();
}
}
Invocation接口的实现
Invocation是插件拦截器的执行实例,包含了Mybatis的Mapper Method和参数,通过它可以动态调用真实的Mapper Method,同时也提供了proceed()方法,以便递归调用Interceptor的intercept()方法。在此我们实现Invocation,代理Mapper Method的调用。
public interface Invocation {
Object proceed() throws Throwable;
Object[] getArgs();
Method getMethod();
Object getTarget();
}
以上就是Mybatis插件模块的四个核心类别及其实现代码示例的介绍,希望对您理解Mybatis插件模块有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis源码分析之插件模块 - Python技术站