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