拦截器生成及调用流程
Mybatis拦截器生效过程
Mybatis拦截器需要实现的接口如下
public interface Interceptor {
//主要做拦截后的逻辑处理
Object intercept(Invocation invocation) throws Throwable;
//代理类生成,不符合条件则返回本身
Object plugin(Object target);
//配置
void setProperties(Properties properties);
}
创建拦截器,实际上是为目标对象创建代理对象,增强其功能。通过时序图可知,代理对象的生成,主要是调用Interceptor.plugin方法【这里可自定义代理对象的生成逻辑】。
实际上,Interceptor.plugin方法,我们一般会委托Plugin类来生成代理对象,即调用Plugin.wrap方法
/**
实际上是一个InvocationHandler,可百度jdk动态代理了解功能用法
*/
public class Plugin implements InvocationHandler {
//被代理对象,第一个代理对象,target为实际对象,后面的代理对象,拿到的都是上一个代理对象
private Object target;
//拦截器,调用wrap时传进来了
private Interceptor interceptor;
//拦截器上面标注的注解@Intercepts中@Signature集合,即需要代理的对象及方法
private Map<Class<?> /*@Signature中的type*/, Set<Method>/*@Signature中的method【反射拿到】*/> signatureMap;
private Plugin(Object target, Interceptor interceptor, Map<Class<?>, Set<Method>> signatureMap) {
this.target = target;
this.interceptor = interceptor;
this.signatureMap = signatureMap;
}
public static Object wrap(Object target, Interceptor interceptor) {
//通过注解拿到目标对象和方法
Map<Class<?>, Set<</