源码解析mybatis拦截器的运行原理

这里我会用2个拦截器作为示例,来讲述整个拦截器的运行流程。我们先看下mybatis-config.xml的配置:

配置之后,就可以直接使用了,代码如下:

public class TestInterceptor {

public static void main(String[] args) throws Exception {

Map<String, Object> map=new HashMap<>();

List<Map<String, Object>> list=DBoperate.mysqlQueryList(map);

System.out.println(list);

}

}

@Intercepts({@Signature(

type = Executor.class,

method = “query”,

args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}

), @Signature(

type = Executor.class,

method = “query”,

args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}

)})

public class Interceptor1 implements Interceptor {

@Override

public Object intercept(Invocation invocation) throws Throwable {

Object[] args = invocation.getArgs();

MappedStatement ms = (MappedStatement)args[0];

Object parameter = args[1];

RowBounds rowBounds = (RowBounds)args[2];

ResultHandler resultHandler = (ResultHandler)args[3];

Executor executor = (Executor)invocation.getTarget();

CacheKey cacheKey;

BoundSql boundSql;

if (args.length == 4) {

boundSql = ms.getBoundSql(parameter);

cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql);

} else {

cacheKey = (CacheKey)args[4];

boundSql = (BoundSql)args[5];

}

System.out.println(“Interceptor1”);

List resultList = executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql);

return resultList;

}

}

@Intercepts({@Signature(

type = Executor.class,

method = “query”,

args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}

), @Signature(

type = Executor.class,

method = “query”,

args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}

)})

public class Interceptor2 implements Interceptor {

@Override

public Object intercept(Invocation invocation) throws Throwable {

Object[] args = invocation.getArgs();

MappedStatement ms = (MappedStatement)args[0];

Object parameter = args[1];

RowBounds rowBounds = (RowBounds)args[2];

ResultHandler resultHandler = (ResultHandler)args[3];

Executor executor = (Executor)invocation.getTarget();

CacheKey cacheKey;

BoundSql boundSql;

if (args.length == 4) {

boundSql = ms.getBoundSql(parameter);

cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql);

} else {

cacheKey = (CacheKey)args[4];

boundSql = (BoundSql)args[5];

}

System.out.println(“Interceptor2”);

List resultList = executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql);

return resultList;

}

}

其他配置和一文看懂mybatis底层运行原理解析这篇里面的一样。

首先我们看获取SqlSession的方法

不多做解释,直接看到org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSessionFromDataSource方法的74行:

继续往下看 newExecutor 方法的579行:

继续看org.apache.ibatis.plugin.InterceptorChain#pluginAll方法:

可以看到这里会去遍历 interceptors 这个集合。那么 interceptors 这个属性是什么时候初始化的呢?

是在构造 SqlSessionFactory 时初始化的,继续往下 会看到 org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration 这个方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值