【12.MyBatis源码剖析与架构实战】17.MyBatis插件的执⾏流程

张开发
2026/4/19 21:02:05 15 分钟阅读

分享文章

【12.MyBatis源码剖析与架构实战】17.MyBatis插件的执⾏流程
要深入理解 MyBatis 插件的执行流程,关键在于把握两个核心概念:拦截器链(Interceptor Chain)和动态代理(Dynamic Proxy)。MyBatis 允许你在不修改其核心代码的情况下,通过插件拦截四大核心对象的方法调用来增强功能。⚙️ 核心机制:责任链模式 + 动态代理MyBatis 插件的执行主要分为两个阶段:初始化阶段:MyBatis 启动时,会从配置文件中解析plugins节点下配置的插件,并将其注册到InterceptorChain(拦截器链)中,形成一个有序列表,顺序至关重要,它决定了后续的执行顺序。执行阶段:当 MyBatis 需要创建Executor、StatementHandler、ParameterHandler、ResultSetHandler这四个核心对象时,会调用InterceptorChain.pluginAll()方法,对目标对象进行层层包装,生成一个代理对象链。当业务代码调用这些核心对象的方法时,代理对象会介入,并按照**后进先出(LIFO,即最后包裹的插件最先执行)**的顺序,依次执行每个插件的intercept()方法,最终再调用原始的目标方法。开发者可以通过invocation.proceed()方法决定是否继续传递请求。🧩 核心组件Interceptor:插件必须实现的接口。@Intercepts@Signature:@Intercepts注解用于声明该类是一个拦截器;其内部的@Signature注解则用于精确定义要拦截的目标接口、方法名和参数类型。InterceptorChain:拦截器链,内部维护了一个有序的ListInterceptor列表,并提供pluginAll()方法将所有拦截器应用到目标对象上。Plugin:一个实现了 JDKInvocationHandler的工具类,用于创建动态代理对象。它的wrap方法是创建代理的核心入口。🚀 执行流程(源码级)以下是一个简化的 Mermaid 流程图,展示了从创建核心对象到方法执行的全过程:1. 初始化阶段:插件加载MyBatis 启动时,XMLConfigBuilder会解析配置文件中的plugins节点,为每个plugin节点创建一个拦截器实例。这些实例会按配置顺序,通过Configuration.addInterceptor()方法添加到InterceptorChain的interceptors列表中。2. 执行阶段:代理包装当 MyBatis 需要创建核心组件时(例如通过Configuration.newExecuto

更多文章