mybatis plugs 插件和原理简介

目录

前言

如下我们将了解一下Mybatis的插件的用法:
Mybatis插件(plugin)顾名思义就是在Mybatis基础上做的集成软件。

主要步骤:

1.写一个实现Interceptor的方法,并且复写intercept方法
2.根据功能写函数实现,
3.测试插件公共功能

代码实现

假如我们直接想做出一个直接输出字符串的功能,那么我们如何写呢?
如下:

按照前文所述,第一步实现Interceptor的接口:

public static class AlwaysMapPlugin implements Interceptor {
}

接下来,第二步:根据功能写一个函数实现,这里因为是实现字符串的功能,所以直接返回特定的字符串。


```java
 @Override
    public Object intercept(Invocation invocation) {
      return "Always";
    }

完整代码:

  @Intercepts({
      @Signature(type = Map.class, method = "get", args = {Object.class})})
  public static class AlwaysMapPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) {
      return "Always";
    }

  }

我们做下测试:看下插件是否调用了该方法和实现返回字符串的功能,我们使用Junit 做下测试:调用一下

@Test
  void mapPluginShouldInterceptGet() {
    Map map = new HashMap();
    map = (Map) new AlwaysMapPlugin().plugin(map);
    assertEquals("Always", map.get("Anything"));
  }

测试结果:
在这里插入图片描述
根据代码所示,测试代码做了字符串的判断,若两者相等,测试通过,
结果是绿色,证明我们的一个简单的mybatis插件就做好了。

实现原理

如上我们做好了Mybatis 插件的一个简单实现,那么原理是什么呢?
Plugin实现了 InvocationHandler接口,因此它的invoke方法会拦截所有的方法调用。invoke方法会 对所拦截的方法进行检测,以决定是否执行插件逻辑。源码如下:

 @Override
  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);
    }
  }

首先获取被拦截方法列表,接着检测方法列表是否包含被拦截的方法,调用intercept方法执行逻辑,执行被拦截的方法。

小结

本文主要讲述了一些mybatis插件和原理简介,不足之处请指正。

参考资料和推荐阅读

1.链接: link.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执于代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值