首页 > 其他分享 >spring-mybatis

spring-mybatis

时间:2022-11-30 18:02:55浏览次数:29  
标签:Mapper 插件 缓存 spring sql mybatis

对我来说,mybatis有几个主要核心模块吧。包括:插件(Plugin)、缓存、动态sql解析,这几个是比较难理解的部分。

加载项目的时候会把mybatis里面的sql解析成一个个的MapperedStatement,里面呢包含一系列的SqlNodel,比如WhereSqlNode,IfSqlNode,在具体执行解析sql的时候,会由SqlNode一步步进行解析(采用了责任链和装饰器模式,一层包着一层,递归解析。),最后拼接成目标要执行的sql。并且将这次查询的statementId,参数等信息封装到缓存当中,如果开启了缓存的话。这些解析的信息最后都会放到一个大的Configuration对象中去。

首先插件主要是基于责任链模式和动态代理的方式对要执行的sql进行增强处理的,比如分页插件。当执行sql的时候,执行器会识别到要做增强的插件,换句话说就是一个拦截器,执行前会先执行插件中得代码逻辑,然后再由Executor执行具体的sql。

然后就是缓存咯,缓存主要用到责任链+装饰器模式,我记得主要有 最原始的一个缓存,然后LRUCache,LogCache,SynchronizedCache等等,一步步调用封装。

 

Mybatis 集成 Spring:

1. 集成SqlSessionFactoryBean是干嘛的,就是用来构建SqlSessionFactory,,用来读取Mybatis的信息设置到configuration中。

2. 怎么集成spring的声明式事务,实际上就是拿到spring的声明式事务,开启事务时,创建一个connection,放在TransactionSychronizationManager.resources中 ... 在构建SqlSessionFactoryBean时,会new一个mybatis-spring适配的一个事务工厂类:SpringManagedTransactionFactory,当mybatis获得Connection就会从这个适配SpringManagedTransaction.getConnection中去获得Connection (这个Connection实际上就是TransactionSynchronizationManager中的Connection)。

 

怎么让Spring去管理Mapper代理?

我们都知道Mapper最后真正的对象都是代理类,是基于jdk代理的。

除了用已经知道的FactoryBean方式去加载Mapper代理,还可以通过@Import的方式自定义BeanDefinitionRegistry的注册Bean定义的逻辑,但这个要求Spring的版本在4.0之后了。还有另外一种方式就是实现BeanDefinitionRegistryPostProcessor接口,然后在方法postProcessBeanDefinitionRegistry()方法中:

BeanDefinitionScanner.doScan 重写isCandidateComponent()方法,去除不扫描接口和抽象类的逻辑。

spring加载的时候会调用invokeBeanFactoryProcessor(beanFactory)方法,

 

 扫描的问题解决了,那么由于没有实例化对象,还是不能创建Bean交个spring容器进行管理,那么就需要创建代理对象,交给Spring容器进行管理了。

怎么创建,在哪里创建呢?

第一种方案:在BeanPostProcessor中做判断,比如只给Mapper包下面的接口创建动态代理,加上这么一个判断。

第二种方案:偷天换日,用FactoryBean去生成真正的Bean对象。

 

 第三种方法:beanDefinition.setFactoryMethodName();

但是静态工厂方法要求传参,class类型,怎么传递呢?如下:

 

 也可以通过属性注入把Mapper接口传进到FactoryBean中。

 

但是要引入SqlSessionFactory,所以要注入到这个BeanDefinitionRegistryPostProcessor中来。通过修改注入类型做到。

但是SqlSessionFactory在spring容器中是SqlSessionFactoryBean。但是因为该类实现了FactoryBean接口,通过调用getObjectType来了个狸猫换太子。

 

 

 

最后就是注册BeanDefinition了。

 

 End!

 

标签:Mapper,插件,缓存,spring,sql,mybatis
From: https://www.cnblogs.com/zhf123/p/16939282.html

相关文章

  • mybatis 连接 oracle使用concat关键字模糊查询
    oracle中不支持concat的三个参数的拼接,需要更正为SELECT*FROM"t_Dormitorys"where"RoomName"likeCONCAT(CONCAT('%','1'),'%')......
  • 关于mybatis中基本类型 条件判断问题
    Mybatis默认采用ONGL解析参数,所以会自动采用对象树的形式取Integer.xxx。Integer对象没有xxx属性。如果不解析参数,mybatis自动识别传入的参数,不会报错。解决办法1.修改selec......
  • spring配置文件beans中报错
     碰到了这个报错:Referencedfilecontainserrors(http://www.springframework.org/schema/tx/spring-tx.xsd).可以用下面步骤清除错误:右键xml文件,选择validate。参......
  • Spring Cloud 合约功能(三)
    4.4.消费者存根生成与HTTP部分不同,在消息传递中,我们需要在JAR中发布合约定义一个存根。然后在消费者端解析它,并创建适当的存根路由。如果类路径上有多个框架,则存根运......
  • mybatis 中 if-test 判断
    之前用都是判断参数是否为空之类的,今天要判断等于一个字符,直接写等于号反而会没有执行直接跳过,后来上网查阅了资料才知道原因是:mybatis是用OGNL表达式来解析的,在OGNL的表......
  • Spring Cloud Config 配置 (二)
    复合环境存储库在某些情况下,您可能希望从多个环境存储库中提取配置数据。为此,可以在配置服务器的应用程序属性或YAML文件中启用配置文件。例如,如果要从一个Subversion......
  • Spring Cloud Connectors 连接器
    介绍SpringCloudConnector为在云平台上运行的基于JVM的应用程序提供了一个简单的抽象,以便在运行时发现绑定服务和部署信息,并支持将发现的服务注册为Springbean。它基......
  • 搞清楚Spring事件机制后:Spring的源码看起来简单多了
    Spring框架已然是Javaeee开发领域的霸主,无论是使用SpringBoot还是SpringCloud,都离不开Spring框架。作为Java开发者,无论是面试求职还是日常开发,就必须得熟练掌握、运用Sprin......
  • 使用 Spring Cloud 合约
    本节将更详细地介绍如何使用Spring云合约。它涵盖主题比如如何使用春云合约的流程。我们也介绍一些春季云合约最佳实践。如果您刚开始使用SpringCloud合约,则在深入研......
  • Spring Boot中使用Filter过滤器
    Filter过滤器一、引入在和管理员有关的Controller中,接口都需要判断当前用户是否为管理员,如果是管理员,则可以操作目录;如果不是管理员,则不能操作;这一连串的身份验证代码都......