Mybatis 插件的运行原理

MyBatis插件基于JDK动态代理和拦截器链实现,拦截Executor、StatementHandler、ResultSetHandler、ParameterHandler四大核心接口。Interceptor接口用于定义拦截逻辑,InterceptorChain存储拦截器列表。在mybatis-config.xml中解析配置,将拦截器添加到Configuration,并通过Plugin作为InvocationHandler实现拦截。
摘要由CSDN通过智能技术生成

核心对象

MyBatis 插件的运行是基于 JDK 动态代理 + 拦截器链实现

  • Interceptor 是拦截器,可以拦截 Executor, StatementHandle, ResultSetHandler, ParameterHandler 四个接口

    实际就是利用 JDK动态代理,生成对应的代理类实例,通过 InvocationHandler#invoke 实现拦截逻辑

  • InterceptorChain 是拦截器链,对象定义在 Configuration 类中, 实际是一个 List集合,元素就是 Interceptor接口的实现类

  • Invocation 是对方法、方法参数、执行对象和方法的执行的封装,就是对 InvocationHandler#invoke方法参数的封装

加载解析拦截器

mybatis-config.xml

<configuration>
    <plugins>
        <plugin interceptor="io.github.tangmonkmeat.MyInterceptor1" />
        <plugin interceptor="io.github.tangmonkmeat.MyInterceptor2"/>
    </plugins>
</configuration>

拦截器的解析是在 XMLConfigBuilder 对象的 parseConfiguration 方法中,

如果是 Mybatis ,则从 SqlSessionFactoryBuilder#build方法开始

如果是 springboot-mybatis-starter,则从 SqlSessionFactoryBean#buildSqlSessionFactory 开始

private void parseConfiguration(XNode root) {
    try {
        // issue #117 read properties first
        propertiesElement(root.evalNode("properties"));
        Properties settings = settingsAsProperties(root.evalNode("settings"));
        loadCustomVfs(settings);
        loadCustomLogImpl(settings);
        typeAliasesElement(root.evalNode("typeAliases"));
        // 开始加载解析插件的标签,添加到 Configuration
        pluginElement(root.evalNode("plugins"));

        objectFactoryElement(root.evalNode("objectFactory"));
        objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
        reflectorFactoryElement(root.evalNode("reflectorFactory"));
        settingsElement(settings);
        // read it after objectFactory and objectWrapperFactory issue #631
        environmentsElement(root.evalNode("environments"));
        databaseIdProviderElement(root.evalNode("databaseIdProvider"));
        typeHandlerElement(root.evalNode("typeHandlers"));
        mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
        throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " &
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值