org.apache.ibatis.plugin.Invocation 类详解
org.apache.ibatis.plugin.Invocation 类详解
核心作用
org.apache.ibatis.plugin.Invocation
是 MyBatis 插件机制中的关键接口,用于封装 MyBatis 方法调用的上下文信息。在自定义拦截器(实现 Interceptor
接口)时,通过 invocation.proceed()
方法可以控制方法的执行流程。
主要方法与功能
方法 | 返回类型 | 描述 | 示例用法 |
---|---|---|---|
getTarget() | Object | 获取目标对象(被拦截的 MyBatis 对象,如 Executor 、MappedStatement 等)。 | Object target = invocation.getTarget(); |
getMethod() | Method | 获取被拦截的方法对象(Java 的反射 Method 类)。 | Method method = invocation.getMethod(); |
getArgs() | Object[] | 获取方法调用的参数列表。 | Object[] args = invocation.getArgs(); |
proceed() | Object | 执行目标方法,必须显式调用才能继续后续流程。 | return invocation.proceed(); |
典型使用场景
-
拦截方法调用
在Interceptor.intercept(Invocation invocation)
方法中,通过invocation
获取方法调用的上下文,并决定是否修改参数或结果。@Override public Object intercept(Invocation invocation) throws Throwable {// 1. 获取方法调用信息Object target = invocation.getTarget();Method method = invocation.getMethod();Object[] args = invocation.getArgs();// 2. 执行目标方法Object result = invocation.proceed();// 3. 处理结果(如日志、异常)return result; }
-
修改参数或返回值
在proceed()
前修改参数,或在之后修改返回值:// 修改参数 args[0] = newParam; Object result = invocation.proceed();// 修改返回值 return enhanceResult(result);
-
绕过方法执行
直接返回自定义结果,而不调用proceed()
(需谨慎,可能导致逻辑中断):if (someCondition) {return customResult; } return invocation.proceed();
注意事项
- 必须调用
proceed()
:若未调用invocation.proceed()
,则目标方法不会执行,可能导致功能异常。 - 异常处理:需在
intercept
方法中捕获异常,避免中断 MyBatis 流程。 - 适用对象:MyBatis 只允许拦截以下 4 个接口:
Executor
ParameterHandler
ResultSetHandler
StatementHandler
总结表格
属性/方法 | 描述 |
---|---|
target | 被拦截的目标对象(如 Executor)。 |
method | 被拦截的方法(反射 Method 对象)。 |
args | 方法调用的参数列表。 |
proceed() | 执行目标方法的核心方法,返回方法结果。 |
典型用途 | 日志、性能监控、参数修改、结果增强等。 |
通过 Invocation
可以灵活控制 MyBatis 的执行流程,是实现插件化扩展的核心工具。