MyBatis插件必须通过@Intercepts和@Signature精准拦截四大核心接口(Executor、StatementHandler、ParameterHandler、ResultSetHandler)的指定方法,且@Signature的type、method、args三者缺一不可,args须严格匹配参数类型数组以区分重载;拦截器需实现Interceptor接口并注册到SqlSessionFactoryBean。

MyBatis 插件通过 @Intercepts 和 @Signature 注解来精准定位拦截点,核心在于明确告诉框架:你要拦谁、拦哪个方法、拦哪一版重载。不写对签名,插件就根本不会触发。
拦截目标必须是四大核心接口之一
MyBatis 只允许在以下四个接口上设拦截点,它们代表 SQL 执行链的关键环节: - Executor:执行器,负责调度整个 SQL 流程(如 `query`、`update`) - StatementHandler:SQL 构建与执行主体(如 `prepare`、`parameterize`、`update`) - ParameterHandler:参数组装环节(如 `setParameters`) - ResultSetHandler:结果集映射环节(如 `handleResultSets`)@Signature 三个参数缺一不可
每个 `@Signature` 必须完整声明: - type:填上面四类接口的 Class 对象,比如 `StatementHandler.class` - method:填该接口中具体的方法名,比如 `"prepare"` - args:填该方法的**完整参数类型数组**,用于区分重载。例如 `Executor.query()` 有多个重载,必须靠 `args` 锁定:@Signature(
type = Executor.class,
method = "query",
args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }
)如果漏掉 CacheKey 或 BoundSql,哪怕只差一个类型,就不会匹配成功。
@Intercepts 支持同时拦截多个位置
一个拦截器类可以一次定义多个拦截点,用大括号包裹多个 `@Signature`:@Intercepts({
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}),
@Signature(type = ParameterHandler.class, method = "setParameters", args = {Statement.class})
})
public class SqlAuditInterceptor implements Interceptor {
// ...
}这样写,prepare 和 setParameters 两个调用都会进入同一个 intercept() 方法,你可以在里面分别处理。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
常见失效原因和检查点
- 拦截类没实现 `Interceptor` 接口 → 不会被识别为插件 - `args` 类型写错(比如把 `Integer.class` 写成 `int.class`,或顺序颠倒)→ 签名不匹配,跳过 - 方法名拼错(如 `"handlResultSets"` 少了个 `e`)→ 找不到方法,静默忽略 - `type` 填了自定义类或 MyBatis 未暴露的内部类 → 不生效 - Spring Boot 中没把拦截器加到 `SqlSessionFactoryBean` 的 `plugins` 列表里 → 根本没注册不复杂但容易忽略。
立即学习“Java免费学习笔记(深入)”;

















