Mybatis拦截器总结

我们假设在MyBatis配置了一个插件,在运行时会发生什么?
1) 所有可能被拦截的处理类都会生成一个代理
2) 处理类代理在执行对应方法时,判断要不要执行插件中的拦截方法
3) 执行插接中的拦截方法后,推进目标的执行

如果有N个插件,就有N个代理,每个代理都要执行上面的逻辑。这里面的层层代理要多次生成动态代理,是比较影响性能的。虽然能指定插件拦截的位置,但这个是在执行方法时动态判断,初始化的时候就是简单的把插件包装到了所有可以拦截的地方。

因此,在编写插件时需注意以下几个原则:
1) 不编写不必要的插件;
2) 实现plugin方法时判断一下目标类型,是本插件要拦截的对象才执行Plugin.wrap方法,否者直接返回目标本省,这样可以减少目标被代理的次数。

1
2
3
4
5
6
7
@Intercepts(
@Signature(
type = Executor.class, // 所要拦截接口的class
method = "query", // 要拦截的方法
args = { MappedStatement.class, Object.class,RowBounds.class, ResultHandler.class } // 方法的参数列表
)
)

0%