在MyBatis中,对某种方法进行拦截调用的机制,被称为plugin插件。使用plugin科技监控方法的调用,还能修改或重写方法逻辑。mybatis中允许使用plugin拦截的方法如下:
Executor // 操作接口类
(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler // 处理参数接口
(getParameterObject, setParameters)
ResultSetHandler // 结果集接口
(handleResultSets, handleOutputParameters)
StatementHandler // 预编译状态接口
(prepare, parameterize, batch, update, query)
注意:如果想修改或覆盖一个给定的方法,可能会打破MyBatis的核心,需谨慎使用。
下面是一个简单拦截器接口的实现:
@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) {
}
}
在类头部添加@Intercepts拦截器注解,声明插件类。其中可声明多个@Signature签名注解,type为接口类型,method为拦截器方法名,args是参数信息。
在MyBatis中的全局配置,起到拦截作用:
<plugins>
<plugin interceptor="com.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
这样就可以对Executor中的update方法进行拦截了。