整体实现其实也很简单,我们想给那个类的哪个方法拦截一下,把实现拦截器,然后配置下要拦截的信息,之后mybatis给我们生成一个动态代理对象,就可以了。
下面我们以具体案例来更加深刻的认识理解其实现原理
加强理解我们使用具体的案例,来走一遍
Case 1 单拦截器单拦截方法 @Intercepts( {@Signature( type= Executor.class, method = "update", args = {MappedStatement.class ,Object.class})} ) public class ExamplePlugin implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { System.out.println("before execute update"); Object returnObject = invocation.proceed(); System.out.println("after execute update"); return returnObject; } }假设目前我们就设置了这么一个拦截器
那么就会生成一个CachingExecutor的代理对象,我们假设代理对象的全限定名是com.sun.proxy.$Proxy0,并且这个对象对象是implements Executor的
这时调用代理对象的update方法调用栈如下
Case 2 单拦截器多拦截方法