Mybatis源码解析七之-拦截器

本文详细探讨了Mybatis的拦截器功能,包括可以拦截的Executor、ParameterHandler、ResultSetHandler和StatementHandler等方法。通过源码分析,揭示了插件如何在Executor的创建阶段生成动态代理,以及在实际调用时如何执行拦截。最后总结了拦截器的生效范围和生命周期。
摘要由CSDN通过智能技术生成

介绍

Mybatis提供插件(plugin)功能,在实际中一般称为拦截器。

可以拦截的方法如下:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed):拦截执行器的方法
  • ParameterHandler (getParameterObject, setParameters):拦截参数处理方法
  • ResultSetHandler (handleResultSets, handleOutputParameters):拦截结果集处理方法
  • StatementHandler (prepare, parameterize, batch, update, query)
    :拦截SQL构建方法

目前已知的使用场景

  • 分页
  • 查看执行的SQL

接口源码

interceptor方法用于处理代理类的执行。

public interface Interceptor {
    //实际调用需要拦截的方法的时候
  Object intercept(Invocation invocation) throws Throwable;
  
//对于Executor是在获取SqlSession阶段,调用
plugin,plugin方法用于某些处理器(Handler)的构建过程
  Object plugin(Object target);

  void setProperties(Properties properties);//解析xml阶段(及构建SqlSessionFactory阶段)调用该方法,将在xml配置的属性通过这个方法设置进来。

}

这里只三个方法,Mybatis中没有具体实现。
官网示例介绍:

@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  public Object intercept(Invocation invocation) throws Throwable {
    return invocation.proceed();
  }
  public Object plugin(Object target) {
    return Plugin.wrap(target, this);
  }
  public void setProperties(Properties properties) {
  }
}

xml配置:

<plugins>
    <plugin interceptor="org.format.mybatis.cache.interceptor.ExamplePlugin"></plugin>
</plugins>

拦截器拦截Executor接口的update方法(其实也就是SqlSession的新增,删除,修改操作),所有执行executor的update方法都会被该拦截器拦截到

源码分析

解析插件

从xml开始解析

XMLConfigBuilder.java
private void pl
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值