七:MyBatis插件

本文深入探讨了MyBatis的插件机制,包括Interceptor接口的intercept和plugin方法,以及插件的初始化过程。插件通过责任链模式对SqlSession的四大对象进行拦截,动态生成代理对象,改变底层逻辑。虽然插件功能强大,但使用需谨慎,以免影响系统稳定性。
摘要由CSDN通过智能技术生成

概述:在第六章节里面有介绍 SqlSession 里面的四大对象 Executor,StatementHandler,ResultSetHandler,ParameterHandler 都是采用责任链去封装他们。即我们可以在责任链的后面添加我们的逻辑来满足特点的需求。这就是MyBatis的插件原理。

一:插件接口

在MyBatis中使用插件。就必须实现Interceptor接口.

intercept方法:它将直接覆盖你所拦截对象原有的方法. 它是插件的核心方法,intercept里面有个Invocation对象,通过它可以反射调度原有对象的方法.

plugin方法:target是被拦截对象,它的作用是给被拦截对象生成一个代理对象。并返回它.为了方便MyBatis使用org.apache.ibatis.plugin.Plugin中的wrap静态方法提供生成代理对象。我们往往使用plugin方法就可以生成一个代理对象

setProperties方法:允许在plugin元素中配置所需参数,该方法在初始化插件的时候被调用一次. 然后将插件对象存入配置中,以便后面再取出.

二:插件初始化

插件的初始化是在MyBatis初始化完成的。在XMLConfigBuilder类中

上面代码说明:

     1.在解析XML 插件的时候。读入插件节点和我们配置的参数

     2.使用反射来生成对应的实例

     3.调用setProperties方法设置我们的参数

     4.最后保存在配置对象中 

三:插件的代理和反射设计

   MyBatis 的插件是用的责任链模式。责任链模式 就是让这个对象在责任链的过程中,每个链上的对象都可以对这个对象进行拦截处理.MyBatis的责任链是由interceptorChain去定义的。比如 Executor创建的时候就有涉及:

        executor=(Executor) interceptorChain.pluginAll(executor);

上面的plugin方法是生成一个代理对象 .当它取出插件的时候是从Configuration对象中取的。从第一个对象开始,将对象传递给plugin方法,然后返回一个代理对象.其他对象也是这样。MyBatis为我们提供了一个代理类Plugin。实现了InvocationHandler,采用了JDK的动态代理.

 如果由多个插件。即第n个插件 的被代理对象 是 n-1个插件对象.最原始的被代理对象就是SqlSession的四大对象本身.

MyBatis的插件功能相当于改变了它的底层逻辑。比较危险.建议一般不要使用。只有对底层原理十分熟悉才可以做这个插件功能.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

echoecho_tongtong

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

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

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

打赏作者

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

抵扣说明:

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

余额充值