加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 建站 > 正文

Mybatis超详细插件机制解析,弄懂拦截器So easy

发布时间:2019-12-26 13:23:53 所属栏目:建站 来源:站长网
导读:副标题#e# 概述 Mybatis插件又称拦截器,本篇文章中出现的拦截器都表示插件。 Mybatis采用责任链模式,通过动态代理组织多个插件(拦截器),通过这些插件可以改变Mybatis的默认行为(诸如SQL重写之类的),由于插件会深入到Mybatis的核心,因此在编写自己的插

Mybatis的插件都要有Intercepts注解来指定要拦截哪个对象的哪个方法。我们知道,Plugin.warp方法会返回四大接口对象的代理对象(通过new Plugin()创建的IvocationHandler处理器),会拦截所有的执行方法。在代理对象执行对应方法的时候,会调用InvocationHandler处理器的invoke方法。Mybatis中利用了注解的方式配置指定拦截哪些方法。具体如下:

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 

  try { 

   Set<Method> methods = signatureMap.get(method.getDeclaringClass()); 

   if (methods != null && methods.contains(method)) { 

     return interceptor.intercept(new Invocation(target, method, args)); 

   } 

   return method.invoke(target, args); 

  } catch (Exception e) { 

   throw ExceptionUtil.unwrapThrowable(e); 

  } 

可以看到,只有通过Intercepts注解指定的方法才会执行我们自定义插件的intercept方法。未通过Intercepts注解指定的将不会执行我们的intercept方法。

官方插件开发方式

@Intercepts({@Signature(type = Executor.class, method = "query", 

    args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})}) 

public class TestInterceptor implements Interceptor { 

  public Object intercept(Invocation invocation) throws Throwable { 

   Object target = invocation.getTarget(); //被代理对象 

   Method method = invocation.getMethod(); //代理方法 

   Object[] args = invocation.getArgs(); //方法参数 

   // do something ...... 方法拦截前执行代码块 

   Object result = invocation.proceed(); 

   // do something .......方法拦截后执行代码块 

   return result; 

  } 

  public Object plugin(Object target) { 

   return Plugin.wrap(target, this); 

  } 

以上就是Mybatis官方推荐的插件实现的方法,通过Plugin对象创建被代理对象的动态代理对象。可以发现,Mybatis的插件开发还是很简单的。

自定义开发方式

Mybatis的插件开发通过内部提供的Plugin对象可以很简单的开发。只有理解了插件实现原理,对应不采用Plugin对象我们一样可以自己实现插件的开发。下面是我个人理解之后的自己实现的一种方式。

public class TestInterceptor implements Interceptor { 

  public Object intercept(Invocation invocation) throws Throwable { 

    Object target = invocation.getTarget(); //被代理对象 

    Method method = invocation.getMethod(); //代理方法 

    Object[] args = invocation.getArgs(); //方法参数 

    // do something ...... 方法拦截前执行代码块 

    Object result = invocation.proceed(); 

    // do something .......方法拦截后执行代码块 

    return result; 

  } 

  public Object plugin(final Object target) { 

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读