概述:在第六章节里面有介绍 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的插件功能相当于改变了它的底层逻辑。比较危险.建议一般不要使用。只有对底层原理十分熟悉才可以做这个插件功能.