1) 有哪些对象允许被代理?有哪些方法可以被拦截?
我们应该了解MyBatis 允许哪些对象的哪些方法允许被拦截,并不是每一个运行的节点都是可以被修改的。只有清楚了这些对象的方法的作用,当我们自己编写插件的时候才知道从哪里去拦截。
在MyBatis 官网有答案,我们来看一下:
http://www.mybatis.org/mybatis-3/zh/configuration.html#plugins
Executor 会拦截到CachingExcecutor 或者BaseExecutor。
因为创建Executor 时是先创建Executor,再拦截。
2) 怎么样创建代理?
如果我们用JDK 的动态代理,要有一个实现了InvocationHandler 的代理类,用来包装被代理对象,这个类是我们自己创建还是谁来创建?
3) 什么时候创建代理对象?是在MyBatis 启动的时候创建,还是调用的时候创建?
4) 被代理后,调用的是什么方法?怎么调用到原被代理对象的方法(比如Executor 的query()方法)?
要解决后面三个问题,我们先看一下别人的插件是怎么工作的。