大家好,我是小米,一个31岁还在坚持敲代码的快乐程序员。今天继续跟大家聊聊我亲身经历的一场 Java 社招面试中的“灵魂拷问”。
那是一个阳光明媚的下午,我一身轻装走进了某知名互联网公司总部。面试官看了眼简历,突然问道:
“小米,你了解 MyBatis 的插件机制吗?它的运行原理你能讲讲吗?如果让你写一个插件,你会怎么写?”
我内心咯噔一下,这题不简单,但幸好,我刚好踩过这个坑!
于是我给他讲了一个故事——《拦截侠:MyBatis插件的秘密使命》,没想到还真打动了面试官。今天我就把这个故事原汁原味地分享给你。
拦截侠现身:MyBatis插件到底是啥?
咱们在写业务代码的时候,经常需要在SQL执行前后加点“小动作”,比如打印SQL日志、自动分页、数据加解密等等。这时候,就轮到“拦截侠”——MyBatis 插件出马了!
在 MyBatis 中,插件其实就是一种拦截机制,它允许我们在某些 特定对象的方法被调用前后,插入自定义逻辑。这就像电影《头号玩家》里那样,在世界运行的背后,还有一套你看不到的“外挂”系统。
MyBatis 插件的核心就是 Interceptor 接口,实现这个接口,我们就能“拦截”MyBatis 的核心流程。
拦截侠的武器:运行原理揭秘
这时候,面试官点点头:“讲得不错,那你说说 MyBatis 插件的运行原理吧?”
我深吸一口气,进入状态:“你可以把插件看成是 JDK 动态代理的一种应用。它的原理可以分为三步走。”
步骤1:拦截目标是谁?
MyBatis 中,有四个目标对象是允许被插件拦截的:
- Executor:负责执行 SQL 语句(增删改查)
- StatementHandler:负责处理 SQL 的执行语句(如拼接 SQL)
- ParameterHandler:负责设置参数
- ResultSetHandler:负责处理查询结果
你想拦截哪个流程?插件就拦在它面前。
步骤2:用 @Intercepts 精准标记
我们通过 @Intercepts 注解+@Signature 来精确定位你要拦截的方法,比如:

这表示:我要拦 Executor 的 update 方法!
步骤3:Plugin.wrap 用动态代理织网
MyBatis 初始化时,会调用 Plugin.wrap(target, interceptor),它会用 JDK 动态代理包住目标对象。
当目标对象的方法被调用时,就会先走到你写的插件里,插件可以选择:
- 拦截后做点处理再放行
- 完全替换掉原方法
- 什么都不干直接放过
这就像在“目标函数”和“真实调用”之间,插了个“拦截侠”检查站,是否放行,全看你写的逻辑。
写插件:实战版“SQL执行时间记录器”
听到这,面试官笑了笑:“你讲得很清楚,那你能现场写个插件吗?”
我说:“我就写一个记录 SQL 执行时间的插件吧,帮开发者找出慢 SQL。”
来,咱一步步来。
第一步:实现 Interceptor 接口

第二步:注册插件
我们需要在 MyBatis 的配置文件中注册这个插件:

或者是 Spring Boot 项目中,用配置类注册插件 Bean。
再聊一个高级用法:分页插件的设计
如果你面试想再拉高一个台阶,可以讲讲“分页插件”的设计原理。
分页插件的核心就是拦截 StatementHandler.prepare() 方法:
- 拿到原始 SQL
- 在 SQL 末尾加上 limit ?, ?
- 同时计算总记录数(执行 count 查询)
- 让参数、结果一起变化
这类插件会用到两个技巧:
- 通过反射拿 BoundSql,然后改 SQL
- 通过 MetaObject 操作 MyBatis 内部对象
你可以讲出这些,基本上面试官会觉得你不仅理解了插件,还能“动手做插件”,这是极大加分项。
总结:写插件要有敬畏之心
MyBatis 插件功能虽强,但也不能乱用。以下是我的一些踩坑建议:
- 不要拦截所有方法,性能会受影响
- 插件之间可能互相嵌套,要注意顺序
- 尽量使用非侵入方式,避免对原有业务代码有影响
插件是“黑魔法”,用得好是神技,用不好会带来 debug 地狱。
尾声:你准备好做下一个“拦截侠”了吗?
最后,面试官看着我说:“你这个故事讲得挺有意思,插件你确实掌握得不错。”
我心想,这回应该能进二面了吧。果然,第二天下午,HR就打电话来约下一轮技术面了。
所以各位,如果你也在准备面试,不妨把“拦截侠”的故事学好,说不定下一个 offer,就是因为你写了一个漂亮的插件!
END
我们下期继续聊聊 MyBatis 的其他神秘力量,如果你喜欢这种“讲故事+技术点”的风格,记得点个「在看」或「关注」,小米每天都有料!
公众号对技术型文章的推送机制有所调整,需要大家多多点赞在看转发收藏,才能让更多技术同行们能看到优质的技术分享~
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
1349

被折叠的 条评论
为什么被折叠?



