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

  • 时间:
  • 浏览:7

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

代码@2:对并都不 BeanDefinitions进行外理,对Bean进行加工,加入Mybatis行态。

注意:addMapper土土妙招,可是我为*Mapper创建对应对应的MapperProxyFactory。

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

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

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

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

SqlSession支持父类,通过使用SqlSessionFactory或SqlSessionTemplate创建SqlSession,那下面几个多 土土妙招会在并都不 那我被调用呢?

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

代码@2:初始化Dao相关的土土妙招,该土土妙招为几个多 空实现。

本文的行文思路如下:

我可是我知道亲们还记不记得,在创建MapperFactoryBean的那我,其属性里会设置SqlSessionFacotry或SqlSessionTemplate,见上文代码(processBeanDefinitions),那我句子在示例化Bean时,Spring会自动注入实例,即在实例化Bean时,上述土土妙招中的几个多 或多个会被调用。

其核心类图如下所示:



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

该土土妙招有几个关键点:

代码@1:BeanDefinition中的beanClass设置的类为MapperFactoryBean,即该BeanDefinition初始化的实例为MapperFactoryBean,其名字可不须要看出,这是几个多 FactoryBean对象,会通过其getObject土土妙招进行构建具体实例。

Dao层的基类,定义几个多 模板土土妙招,供其子类实现具体的逻辑,DaoSupport的模板土土妙招如下:

那亲们接下来从BeanDefinitionRegistryPostProcessor的实现接口结速了了跟踪。

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

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

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

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

分析到这里,MapperScannerConfigurer的doScan土土妙招就结速了了了,但并这麼初始化Mapper,可是我创建了统统 的BeanDefinition,统统其beanClass为MapperFactoryBean,那亲们将目光转向MapperFactoryBean。

MapperScannerConfigurer的类图如下所示:



MapperScannerConfigurer实现Spring Bean生命周期相关的类:BeanNameAware、ApplicationContextAware、BeanFactoryPostProcessor、InitializingBean、BeanDefinitionRegistryPostProcessor,亲们先来看一下并都不 接口对应的土土妙招的调用时机:

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

MapperFactoryBean的类图如下:



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

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

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

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

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

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

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

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

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

下面简单介绍MapperRegistry的几个土土妙招,真是现都比较简单。

类图如下:



后面 的类都比较简单,MapperMethod,代表几个多 几个多 的Mapper土土妙招,从SqlCommand可不须要看出,每几个多 MapperMethod一定会对应三根SQL句子。

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



亲们注意到这里有两几个多 与Mapper相关的配置:

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

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

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

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

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

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

主要看它是咋样实现checkDaoConfig的。