Mybatis 插件
Mybatis 插件介绍
Mybatis 借助于四大核心对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)对持久层的进行操作。支持用插件对四大核心对象进行拦截,增强核心对象的功能。
增强功能本质上是借助于底层的动态代理实现的,所以 MyBatis 中的四大对象都是代理对象。
MyBatis 所允许拦截的方法如下:
- 执行器 Executor(update、query、commit、rollback等方法)
- SQL语法构建器 StatementHandler(prepare、parameterize、batch、updates query 等方法)
- 参数处理器 ParameterHandler(getParameterObject、setParameters方法)
- 结果集处理器 ResultSetHandler(handleResultSets、handleOutputParameters等方法)
Mybatis 插件原理
在四大对象创建的时候
- 每个创建出来的对象不是直接返回的,而是通过 interceptorChain.pluginAll(parameterHandler) 方法的代理对象。
- pluginAll 会调用所有的 Interceptor 的 plugin 方法,返回被重重代理后的对象。
四大组件都会调用 interceptorChain.pluginAll 生成代理对象
时序图
自定义插件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| @Intercepts({ //大花括号,可以定义多个@Signature对多个地方拦截 @Signature(type = StatementHandler.class, //这是指拦截哪个接口 method = "prepare", //这个接口内的哪个方法名 args = {Connection.class, Integer.class} // 这是拦截的方法的入参,按顺序写到这,如果方法重载通过方法名和入参来确定方法 ) }) public class MyPlugin implements Interceptor {
@Override public Object intercept(Invocation invocation) throws Throwable { System.out.println("对方法进行了增强...."); return invocation.proceed(); }
@Override public Object plugin(Object target) { System.out.println("将要包装的目标对象: " + target); return Interceptor.super.plugin(target); }
@Override public void setProperties(Properties properties) { System.out.println("插件配置的初始化参数: " + properties); Interceptor.super.setProperties(properties); }
}
|
mybatis 配置文件中
1 2 3 4 5 6
| <plugins> <plugin interceptor="com.li.plugin.MyPlugin"> <property name="name" value="狗蛋"/> </plugin> </plugins>
|