MyBatis拦截器原理介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis拦截器原理介绍相关的知识,希望对你有一定的参考价值。
参考技术AMyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下, MyBatis 允许使用插件来拦截的方法调用包括:
自定义一个mybatis的拦截器步骤包含:
拦截点说明:
拦截器的原理核心的内容在于拦截器配置解析、拦截器的职责链构造、拦截器的执行,串联上述功能后就能传统整体的流程。
拦截器解析说明:
拦截器织入说明:
拦截器织入说明:
拦截器织入说明:
Mybatis拦截器(插件实现原理)
在mybatis的mybatis.cfg.xml中插入:
<plugins>
<plugin interceptor="cn.sxt.util.PageInterceptor"/>
</plugins>
<mappers>
<mapper resource="cn/sxt/vo/user.mapper.xml"/>
</mappers>
对于Executor,Mybatis中有几种实现:BatchExecutor、ReuseExecutor、SimpleExecutor和CachingExecutor。
这个时候如果你觉得这几种实现对于Executor接口的query方法都不能满足你的要求,那怎么办呢?是要去改源码吗?当然不。
我们可以建立一个Mybatis拦截器用于拦截Executor接口的query方法,在拦截之后实现自己的query方法逻辑,
之后可以选择是否继续执行原来的query方法。
public interface Interceptor {
Object intercept(Invocation invocation) throws Throwable;
Object plugin(Object target);
void setProperties(Properties properties)
}
plugin方法是拦截器用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理。
setProperties方法是用于在Mybatis配置文件中指定一些属性的。
@Intercepts用于表明当前的对象是一个Interceptor,
@Signature则表明要拦截的接口、方法以及对应的参数类型。
MappedStatement.class, Object.class, RowBounds.class,
ResultHandler.class }),
?
@Intercepts标记了这是一个Interceptor,然后在@Intercepts中定义了两个@Signature,即两个拦截点。
@Signature我们定义了该Interceptor将拦截Executor接口中参数类型为MappedStatement、Object、RowBounds和ResultHandler的query方法;
第二个@Signature我们定义了该Interceptor将拦截StatementHandler中参数类型为Connection的prepare方法。
只能拦截四种类型的接口:Executor、StatementHandler、ParameterHandler和ResultSetHandler。(动态代理模式)
拦截器实现Mybatis分页的一个思路就是拦截StatementHandler接口的prepare方法,
以上是关于MyBatis拦截器原理介绍的主要内容,如果未能解决你的问题,请参考以下文章