本文主要是介绍mybatis plugs 插件和原理简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
前言
如下我们将了解一下Mybatis的插件的用法:
Mybatis插件(plugin)顾名思义就是在Mybatis基础上做的集成软件。
主要步骤:
1.写一个实现Interceptor的方法,并且复写intercept方法
2.根据功能写函数实现,
3.测试插件公共功能
代码实现
假如我们直接想做出一个直接输出字符串的功能,那么我们如何写呢?
如下:
按照前文所述,第一步实现Interceptor的接口:
public static class AlwaysMapPlugin implements Interceptor {
}
接下来,第二步:根据功能写一个函数实现,这里因为是实现字符串的功能,所以直接返回特定的字符串。```java@Overridepublic Object intercept(Invocation invocation) {return "Always";}
完整代码:
@Intercepts({@Signature(type = Map.class, method = "get", args = {Object.class})})public static class AlwaysMapPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) {return "Always";}}
我们做下测试:看下插件是否调用了该方法和实现返回字符串的功能,我们使用Junit 做下测试:调用一下
@Testvoid mapPluginShouldInterceptGet() {Map map = new HashMap();map = (Map) new AlwaysMapPlugin().plugin(map);assertEquals("Always", map.get("Anything"));}
测试结果:
根据代码所示,测试代码做了字符串的判断,若两者相等,测试通过,
结果是绿色,证明我们的一个简单的mybatis插件就做好了。
实现原理
如上我们做好了Mybatis 插件的一个简单实现,那么原理是什么呢?
Plugin实现了 InvocationHandler接口,因此它的invoke方法会拦截所有的方法调用。invoke方法会 对所拦截的方法进行检测,以决定是否执行插件逻辑。源码如下:
@Overridepublic 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.
这篇关于mybatis plugs 插件和原理简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!