简单了解mybatis拦截器实现原理及实例
三个核心方法都加了详细的注释,而且结合案例需求说明问题
那么多文字不想行看,没关系有概括 总结: 1.在mybatis中可被拦截的类型有四种(按照拦截顺序): Executor:拦截执行器的方法。 ParameterHandler:拦截参数的处理。 ResultHandler:拦截结果集的处理。 StatementHandler:拦截Sql语法构建的处理。 2.各个参数的含义: @Intercepts:标识该类是一个拦截器; @Signature:指明自定义拦截器需要拦截哪一个类型,哪一个方法; 2.1 type:对应四种类型中的一种; 2.2 method:对应接口中的哪类方法(因为可能存在重载方法); 2.3 args:对应哪一个方法; 不知道能否帮助你理解,我的表达能力有限~~~ 接下来我们看看 Plugin 类 package org.apache.ibatis.plugin; * Plugin 类其实就是一个代理类,因为它实现了jdk动态代理接口 InvocationHandler * 我们核心只需要关注两个方法 * wrap: * 如果看懂了代码案例1的例子,那么这个方法很理解,这个方法就是 mybatis 提供给开发人员使用的一个工具类方法, * 目的就是帮助开发人员省略掉 反射解析注解 Intercepts 和 Signature,有兴趣的可以去看看源码 Plugin#getSignatureMap 方法 * invoke: * 这个方法就是根据 wrap 方法的解析结果,判断当前拦截器是否需要进行拦截, * 如果需要拦截:将 目标对象+目标方法+目标参数 封装成一个 Invocation 对象,给我们自定义的拦截器 MyInterceptor 的 intercept 方法 * 这个时候就刚好对应上了上面案例1中对 intercept 方法的解释了,它就是我们要处理自己逻辑的方法, * 处理好了之后是否需要调用目标对象的方法,比如上面说的 打印了sql语句,是否还要查询数据库呢?答案是肯定的 * 如果不需要拦截:则直接调用目标对象的方法 * 比如直接调用 Executor 的 update 方法进行更新数据库 class Plugin implements InvocationHandler { public static Object wrap(Object target, Interceptor interceptor) { // 省略 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 省略 } 贴一段网上的通用解释吧: (编辑:辽源站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |