栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis-plus的插件机制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis-plus的插件机制

插件介绍
  1. MybatisPlusInterceptor(since 3.4.0)是核心插件,目前代理了 Executor#query 和 Executor#update 和 StatementHandler#prepare 方法
  2. 使用方式(以分页插件举例)
    
         
        
        
            
                
            
        
    
    
    
        
        
    
    
    
        
            
                
            
        
    
    
    
        
        
    
    
代理类MybatisMapperProxy的初始化


从上图可以看出MybatisMapperProxy初始化的入口在MapperFactoryBean#getObject

mapper接口怎么封装成MapperFactoryBean了?
  1. 指定mapper包路径@MapperScan(basePackages = {“xxxx”,“xxxx”})
  2. 重点关注MapperScannerRegistrar#registerBeanDefinitions
    2.1 读取@MapperScan注解的basePackages属性值
    2.2 将basePackage属性设置到MapperScannerConfigurer中
    2.3 将MapperScannerConfigurer注册到spring容器中
    BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);
    builder.addPropertyValue("processPropertyPlaceHolders", true);
    builder.addPropertyValue("basePackage", StringUtils.collectionToCommaDelimitedString(basePackages));
    registry.registerBeanDefinition(beanName, builder.getBeanDefinition());
    
MapperScannerConfigurer扫描mapper接口
  1. MapperScannerConfigurer类实现BeanDefinitionRegistryPostProcessor接口
  2. 关注MapperScannerConfigurer#postProcessBeanDefinitionRegistry方法
    2.1 扫描basePackage包下的mapper接口
     ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
     scanner.scan(
            StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));
    
  3. 扫描实现ClassPathBeanDefinitionScanner#scan
    3.1 扫描的简易流程ClassPathBeanDefinitionScanner#scan --> ClassPathMapperScanner#doScan --> ClassPathMapperScanner#processBeanDefinitions

    3.2 从上图可以发现mapper接口最终注册到spring容器中的是MapperFactoryBean
插件的初始化

  1. 从上图的调用栈可以看出,mybatis-plus自动配置SessionFactory
  2. 重点关注MybatisSqlSessionFactoryBean#buildSqlSessionFactory
    2.1 在方法中会判断是否设置插件拦截器属性
    2.2 最终将插件添加到mybatis的拦截器链上Configuration$interceptorChain

    2.2 解析xml文件

    2.3 构建初始化生成SqlSessionFactory(DefaultSqlSessionFactory)
MybatisMapperProxy代理执行流程分析

  1. 从上面的流程可以看出SQL操作最终通过代理方法SqlSessionInterceptor#invoke实现
  2. 在DefaultSqlSessionFactory#openSessionFromDataSource生成sqlSession时,将其configuration属性进行传递(包含插件链)
  3. 关注DefaultSqlSession#delete
执行器执行指定SQL操作:MybatisSimpleExecutor#doUpdate

  1. 根据配置生成StatementHandler:
  2. 遍历插件链,执行InterceptorChain#plugin方法
    2.1 插件执行在解析参数和执行SQL之前
后序

以上就是对插件分析,后面准备基于插件功能做一个SQL更新操作的diff功能

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/275005.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号