本文主要分析MyBatis的插件机制,实际就是Java动态代理实现的责任链模式实现。
根据官方文档。Mybatis只允许拦截以下方法,这个决定写拦截器注解签名参数。
| 代码如下 | 复制代码 |
| Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler (getParameterObject, setParameters) ResultSetHandler (handleResultSets, handleOutputParameters) StatementHandler (prepare, parameterize, batch, update, query) | |
拦截处理的源码如下,其中interceptorChain.pluginAll(..)即为织入自定义拦截器:
| 代码如下 | 复制代码 |
|
/* org.apache.ibatis.session.Configuration类中方法 */ public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler, public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { public Executor newExecutor(Transaction transaction, ExecutorType executorType) { | |
实现一个自定义拦截器只需实现Interceptor接口即可,大致代码如下:
| 代码如下 | 复制代码 |
|
/* 注解表明要拦截哪个接口的方法及其参数 */ public Object intercept(Invocation invocation) throws Throwable{ /*生成成对目标target的代理,而@Intercepts的注解是在Plugin.wrap中用到*/ /*用于设置自定义的拦截器配置参数*/ | |
其中,拦截调用的代码均在Plugin.wrap中:
| 代码如下 | 复制代码 |
|
/* org.apache.ibatis.plugin.Plugin类 */ /* 省略代码... */ public static Object wrap(Object target, Interceptor interceptor) { /* 拦截目标类的所有方法的执行都会变为在此执行 */ /* 省略代码... */ } | |
可以看到MyBatis的拦截器设计核心代码还是比较简单的,但是足够灵活。实际使用时注意,不做无意义的代理(Plugin.wrap)。
《黎明杀机》开发商正开发新的《Serious Sam》游戏 由Devolver发行
超英派遣中心即将登陆Xbox Play Anywhere 深入了解这款独特而备受喜爱的冒险游戏
在《Hunter: The Reckoning – Deathwish》中怎么从猎物蜕变为猎手
《The Expanse: Osiris Reborn》——深入了解玩法 新同伴 封闭测试及发行窗口
Alien Deathstorm 科幻生存与动作结合 打造全新第一人称恐怖混合体验
宝可梦公司已在考虑未来可用口袋妖怪总数达到“或许一万只”
幸存者村庄2
怪可爱的店折相思菜单
怪可爱的店折相思菜单是一款画风治愈的模拟经营佳作,内置折相思菜单解锁多项便利功能
lol电竞经理人手游
lol电竞经理人手游让你可以成为职业的电竞经理人,在游戏中掌控游戏的走向!豪华阵
梦幻奶茶屋小游戏
梦幻奶茶屋是一款主打温馨治愈氛围的休闲经营作品,玩家将化身元气满满的奶茶店店长,
萌宠养成物语无限金币版
萌宠养成物语无限金币版是一款治愈系模拟养成游戏,以可爱卡通画风构建温馨虚拟世界,