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

  • 时间:
  • 浏览:2
  • 来源:大发彩神安卓下载—大发彩神官方下载

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

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

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

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

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

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

该法律妙招有五个关键点:

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

我太久太久知道我门我门我门我门还记不记得,在创建MapperFactoryBean的前一天,其属性里会设置SqlSessionFacotry或SqlSessionTemplate,见上文代码(processBeanDefinitions),这样 句子在示例化Bean时,Spring会自动注入实例,即在实例化Bean时,上述法律妙招中的另一一俩个 或多个会被调用。

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

代码@2:初始化Dao相关的法律妙招,该法律妙招为另一一俩个 空实现。

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

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

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

类图如下:



底下的类都比较简单,MapperMethod,代表另一一俩个 另一一俩个 的Mapper法律妙招,从SqlCommand还要看出,每另一一俩个 MapperMethod有无对应根小SQL句子。

本文的行文思路如下:

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

代码@2:为该接口注册MapperProxyFactory,但这里太久太久注册其创建MapperProxy的工厂,不言而喻是创建MapperProxy。

代码@3:将会Mapper对应的xml资源未加载,触发xml的绑定操作,将xml中的sql句子与Mapper建立关系。本文将不全版介绍,在下一篇中全版介绍。

这样 们接下来从BeanDefinitionRegistryPostProcessor的实现接口现在现在开始 跟踪。

SqlSession支持父类,通过使用SqlSessionFactory或SqlSessionTemplate创建SqlSession,那下面另一一俩个 法律妙招会在那些前一天被调用呢?

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

代码@2:调用ClassPathMapperScanner的scan法律妙招进行扫描动作,接下来全版介绍。

主要看它是怎么可以实现checkDaoConfig的。

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

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

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

MapperScannerConfigurer的类图如下所示:



MapperScannerConfigurer实现Spring Bean生命周期相关的类:BeanNameAware、ApplicationContextAware、BeanFactoryPostProcessor、InitializingBean、BeanDefinitionRegistryPostProcessor,我门我门我门我门先来看一下那些接口对应的法律妙招的调用时机:

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

其核心类图如下所示:



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

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

代码@2:对那些BeanDefinitions进行防止,对Bean进行加工,加入Mybatis社会形态。

代码@1:首先先调用父类的checkDaoConfig法律妙招。

代码@2:mapperInterface,太久太久具体的Mapper的接口类,类似com.demo.dao.UserMapper,将会以注册,则抛出异常,怎么能让调用configuration增加Mapper。

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

代码@3:将会sqlSessionTemplate不为空,则装下 到属性中,以便Spring在实例化MapperFactoryBean时还要得到对应的SqlSessionTemplate。

首先进入源码学习前一天,我门我门我门我门先看一下在项目中的配置文件信息。



我门我门我门我门注意到这里有两另一一俩个 与Mapper相关的配置:

注意:addMapper法律妙招,太久太久为*Mapper创建对应对应的MapperProxyFactory。

MapperFactoryBean的类图如下:



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

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

分析到这里,MapperScannerConfigurer的doScan法律妙招就现在现在开始 了,但并这样 初始化Mapper,太久太久创建了太久太久的BeanDefinition,怎么能让其beanClass为MapperFactoryBean,这样 们将目光转向MapperFactoryBean。

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

下面简单介绍MapperRegistry的有几个法律妙招,实在现都比较简单。