拦截器
拦截器的作用就是在执行sql的过程中插入一些执行逻辑,比如记录当前执行的sql、分页等
使用
@Intercepts({
@Signature(
type= Executor.class,
method = "update",
args = {
MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
return invocation.proceed();
}
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties) {
}
}
使用另一个自定义的拦截器,只需要另找个拦截器实现Interceptor接口,并且使用注解@Intercepts来声明对哪些类的哪些方法进行拦截即可
接口
public interface Interceptor {
// 用来对一次调用进行拦截操作
Object intercept(Invocation invocation) throws Throwable;
// 在目标对象外层包裹interceptor
default Object plugin(Object target) {
return Plugin.wrap(target, this);
}
default void setProperties(Properties properties) {
// NOP
}
}
加载
在使用XMLConfigBuilder解析mybatis配置文件的时候,会调用pluginElement方法
pluginElement(root.evalNode("plugins"));
private void pluginElement(XNode parent) throws Exception {
if (parent != null) {
// 遍历plugins标签下的所有plugin标签,每个plugin标签对应一个拦截器
for (XNode child : parent.getChildren