page contents

mybatis 插件问题

Pack 发布于 2020-01-20 16:01
阅读 500
收藏 0
分类:Java开发

官网上说插件可以拦截这四大对象的这些方法,
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

ParameterHandler (getParameterObject, setParameters)

ResultSetHandler (handleResultSets, handleOutputParameters)

StatementHandler (prepare, parameterize, batch, update, query)
那这四大对象里还有其他的方法,为啥不能被拦截呢,按照java规范,如果一个接口被代理了,那这个接口里的所有方法都是可以被拦截的,为啥在mybatis里不行呢,求大神解答!!!

232
Pack
Pack

设计层面已经给你回答过了:

你要使用别人的产品,就要按照别人的规范来使用。

MyBatis为什么设计成四个类的特定方法可以拦截,也非常容易理解:

只有核心对象的主要方法可以拦截,以部分修改或增强MyBatis的功能。

如果所有的类和所有的方法都可以被拦截,那它也不是MyBatis了。


实现层面:

Executor的代理对象是在DefaultSqlSession中起作用的。

只有在DefaultSqlSession中,executor才是在调用代理类Plugin的方法。


 attachments-2020-01-AArbTE345e255e898cd4f.png


也就是说,只有在DefaultSqlSession类里面调用的executor的实现方法,才可以被Plugin拦截(替换)。

 

attachments-2020-01-xmpT4Bb05e255e933b3bc.png

官方声明可以被拦截的方法 (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed),就是DefaultSqlSession中调用了的executor对象的所有的方法。


否则拦截了DefaultSqlSession中调用的executor之外的方法,在Plugin的invoke()方法中contains会返回false,不会进入到插件的执行流程interceptor.intercept()。

 

attachments-2020-01-4Cwrzrsn5e255e9a7fe68.png

 

请先 登录 后评论