源码分析Mybatis MapperProxy初始化之Mapper对象的扫描与构建

  • 时间:
  • 浏览:0

根据Mapper接口与SqlSession创建MapperProxy对象。

代码@1:根据接口获取MapperProxyFactory。

代码@2:调用MapperProxyFactory的newInstance创建MapperProxy对象。

主要看它是如可实现checkDaoConfig的。

分析到这里,MapperScannerConfigurer的doScan办法就开使了了了,但并那末初始化Mapper,可是我创建了全都的BeanDefinition,如可让其beanClass为MapperFactoryBean,原来们将目光转向MapperFactoryBean。

从底下代码都都要看出,正在注册(再加)、查询、获取Mapper的核心类为MapperRegistry。

下面简单介绍MapperRegistry的有几个办法,确实现都比较简单。

温馨提示:本文只阐述了Mybatis MapperProxy的创建流程,MapperProxy与*.Mapper.xml即SQL是如可关联的本文未涉及到,这每种的内容请看下文,即将发布。

代码@2:将为MapperFactoryBean设置属性,将SqlSessionFactory放入去 其属性中,在实例化时都都要自动获取到该SqlSessionFactory。

原来们接下来从BeanDefinitionRegistryPostProcessor的实现接口开使了了跟踪。

代码@1:首先先调用父类的checkDaoConfig办法。

代码@2:mapperInterface,可是我具体的Mapper的接口类,类式于com.demo.dao.UserMapper,之后以注册,则抛出异常,如可让调用configuration增加Mapper。

到目前为止Mybatis Mapper的初始化构造过程就完成一半了,即MapperScannerConfigurer通过包扫描,如可让构建MapperProxy,但此时MapperProxy还未与mapper.xml文件中的sql得话建立关联,之后篇幅的由于分析,将在下一节重点介绍其关联关系建立的流程。接下来大伙儿先一睹MapperProxy对象,毕竟这是本文最终要创建的对象,也为后续SQL的执行流程做个简单准备。

该办法有十个 关键点:

代码@1:BeanDefinition中的beanClass设置的类为MapperFactoryBean,即该BeanDefinition初始化的实例为MapperFactoryBean,其名字都都要看出,这是另一个多多多FactoryBean对象,会通过其getObject办法进行构建具体实例。

温馨提示:本文基于Mybatis.3.x版本。

接下来进入到org.apache.ibatis.session.Configuration中。

MapperScannerConfigurer,Spring整合Mybatis的核心类,其作用是扫描项目中Dao类,将其创建为Mybatis的Maper对象即MapperProxy对象。

代码@3:之后sqlSessionTemplate不为空,则放入去 到属性中,以便Spring在实例化MapperFactoryBean时都都要得到对应的SqlSessionTemplate。

MapperFactoryBean的类图如下:



先对上述核心类做另一个多多多简述:

类图如下:



底下的类都比较简单,MapperMethod,代表另一个多多多另一个多多多的Mapper办法,从SqlCommand都都要看出,每另一个多多多MapperMethod后会对应根小SQL得话。

本文的行文思路如下:

代码@1:检查或构建dao的配置信息,该办法为抽象类,供子类实现,等下大伙儿本节的主角MapperFactoryBean主要实现该办法,从而实现与Mybatis相关的整合信息。

代码@2:初始化Dao相关的办法,该办法为另一个多多多空实现。

下面的源码分析或许会比较枯燥,进入源码分析之后,先给出MapperProxy的创建序列图。

MapperScannerConfigurer的类图如下所示:



MapperScannerConfigurer实现Spring Bean生命周期相关的类:BeanNameAware、ApplicationContextAware、BeanFactoryPostProcessor、InitializingBean、BeanDefinitionRegistryPostProcessor,大伙儿先来看一下有有哪些接口对应的办法的调用时机:

原文发布时间为:2019-05-21

本文作者:丁威,《RocketMQ技术内幕》作者。

本文来自底下件兴趣圈,了解相关信息都都要关注底下件兴趣圈。

注意:addMapper办法,可是我为*Mapper创建对应对应的MapperProxyFactory。

代码@1:之后该接口之后注册,则抛出之后绑定的异常。

代码@2:为该接口注册MapperProxyFactory,但这里可是我注册其创建MapperProxy的工厂,并后会 创建MapperProxy。

代码@3:之后Mapper对应的xml资源未加载,触发xml的绑定操作,将xml中的sql得话与Mapper建立关系。本文将不完整性介绍,在下一篇中完整性介绍。

首先进入源码学习之后,大伙儿先看一下在项目中的配置文件信息。



大伙儿注意到这里有两另一个多多多与Mapper相关的配置:

他不知道大伙儿还记不记得,在创建MapperFactoryBean的之后,其属性里会设置SqlSessionFacotry或SqlSessionTemplate,见上文代码(processBeanDefinitions),原来得话在示例化Bean时,Spring会自动注入实例,即在实例化Bean时,上述办法中的另一个多多多或多个会被调用。

代码@1:首先设置SqlSessionFactory,从该Scan器生成的Mapper最终后会 受该SqlSessionFactory的管辖。

代码@2:调用ClassPathMapperScanner的scan办法进行扫描动作,接下来完整性介绍。

下面以一张以SqlSessionFacotry为视角的各核心类的关系图:

Dao层的基类,定义另一个多多多模板办法,供其子类实现具体的逻辑,DaoSupport的模板办法如下:

SqlSession支持父类,通过使用SqlSessionFactory或SqlSessionTemplate创建SqlSession,那下面另一个多多多办法会在有哪些之后被调用呢?

其核心类图如下所示:



对其属性做个简单的介绍:

代码@1:首先调用父类(org.springframework.context.annotation.ClassPathBeanDefinitionScanner)办法,根据扫描的文件,构建对应的BeanDefinitionHolder对象。

代码@2:对有有哪些BeanDefinitions进行除理,对Bean进行加工,加入Mybatis价值形式。