在上一篇文章:MyBatis 教程 - MyBatis插件(Plugins)开发 中已经介绍了如何去开发一个MyBatis 插件,本文将结合MyBatis 源码来揭秘MyBatis Plugins内部实现原理。
Mybatis3 插件采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的)。
本文分析使用的MyBatis 源代码版本为3.4.1
先来看看上一篇文章中实现的插件,代码如下:
package com.bytebeats.mybatis3.interceptor;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.util.Properties;
/**
* ${DESCRIPTION}
*
* @author Ricky Fung
* @date 2017-02-17 11:52
*/
@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class, Integer.class}) })
public class SQLStatsInterceptor implements Interceptor {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
BoundSql boundSql = statementHandler.getBoundSql();
String sql = boundSql.getSql();
logger.info("mybatis intercept sql:{}", sql);
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
String dialect = properties.getProperty("dialect");
logger.info("mybatis intercept dialect:{}", dialect);
}
}
实现原理分析
Mybatis支持对Executor、StatementHandler、PameterHandler和ResultSetHandler 接口进行拦截,也就是说会对这4

本文深入剖析MyBatis插件的实现原理,重点探讨责任链模式在MyBatis拦截器中的应用。通过对Executor、StatementHandler等接口的拦截,插件能够改变MyBatis的行为,如SQL重写。文章通过源码分析,展示了InterceptorChain、Interceptor、Invocation等关键类的作用,并以Servlet FilterChain和OkHttp Interceptors为例,阐述责任链模式的实际应用。
实现原理&spm=1001.2101.3001.5002&articleId=55657776&d=1&t=3&u=1216f80d0adf46eba7a232adf4fd022a)

被折叠的 条评论
为什么被折叠?



