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

  • 时间:
  • 浏览:2
  • 来源:uu直播快3_UU快3直播平台

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

MapperScannerConfigurer的类图如下所示:



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

下面简单介绍MapperRegistry的哪几个辦法 ,着实现都比较简单。

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

代码@2:对哪些BeanDefinitions进行除理,对Bean进行加工,加入Mybatis特性。

本文的行文思路如下:

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

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

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

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

从后面 代码还不能看出,正在注册(加带)、查询、获取Mapper的核心类为MapperRegistry。

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

注意:addMapper辦法 ,本来 为*Mapper创建对应对应的MapperProxyFactory。

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

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

不知道当我们还记不记得,在创建MapperFactoryBean的本来 ,其属性里会设置SqlSessionFacotry或SqlSessionTemplate,见上文代码(processBeanDefinitions),本来 一句话在示例化Bean时,Spring会自动注入实例,即在实例化Bean时,上述辦法 中的另另一个多 多或多个会被调用。

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

代码@2:mapperInterface,本来 具体的Mapper的接口类,例如com.demo.dao.UserMapper,本来 以注册,则抛出异常,只要调用configuration增加Mapper。

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

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

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

其核心类图如下所示:



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

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

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

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

分析到这里,MapperScannerConfigurer的doScan辦法 就本来 始于了了了,但并越来越 初始化Mapper,本来 创建了什么都有的BeanDefinition,只要其beanClass为MapperFactoryBean,本来 们将目光转向MapperFactoryBean。

MapperFactoryBean的类图如下:



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

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

代码@2:为该接口注册MapperProxyFactory,但这里本来 注册其创建MapperProxy的工厂,并总要创建MapperProxy。

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

代码@3:本来 sqlSessionTemplate不为空,则贴到 到属性中,以便Spring在实例化MapperFactoryBean时还不能得到对应的SqlSessionTemplate。

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

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

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

本文来自后面 件兴趣圈,了解相关信息还不能关注后面 件兴趣圈。

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

代码@2:调用ClassPathMapperScanner的scan辦法 进行扫描动作,接下来删改介绍。

该辦法 有五个关键点:

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

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

本来 们接下来从BeanDefinitionRegistryPostProcessor的实现接口本来 刚始于了了跟踪。

类图如下:



后面 的类都比较简单,MapperMethod,代表另另一个多 多另另一个多 多的Mapper辦法 ,从SqlCommand还不能看出,每另另一个多 多MapperMethod总要对应二根SQL一句话。

首先进入源码学习本来 ,当我们先看一下在项目中的配置文件信息。



当我们注意到这里有两另另一个多 多与Mapper相关的配置: