Spring整合MyBatis之MapperFactoryBean
来源:http://www.tudoupe.com时间:2022-03-06
目录
- 前言
- `MapperFactoryBean` 概述
- `MapperFactoryBean` 类的作用
- `MapperFactoryBean` 源码
- `FactoryBean` 接口的作用
- `MapperFactoryBean` 中的 `getObject()`
- `SqlSessionDaoSupport` 中的 `getSqlSession()`
- `SqlSessionTemplate` 中的 `getMapper()`
- `Configuration` 类的 `getMapper()`
- `MapperRegistry` 类中的 `getMapper()`
- `MapperProxyFactory` 类中的 `newInstance()`
- `MapperProxy` 类的 `invoke()`
前言
在Spring整合MyBatis的过程中,我们经常会配置注入MapperFactoryBean这个类
那么这个MapperFactoryBean类是干嘛的?有什么作用?
MapperFactoryBean概述
MapperFactoryBean是实现了FactoryBean接口的工厂bean- 你日常调用的
dao层接口就是MapperFactoryBean实例化的
为什么dao层接口能够执行,我们都知道接口是不能实例化的,答案只有一个那就是MyBatis帮我们代理了dao接口
MapperFactoryBean类的作用
首先,看一下它的源码长啥样,分析它的源码
MapperFactoryBean源码
它实现了一个很重要的FactoryBean接口
FactoryBean接口的作用
分析FactoryBean接口,我们看到该接口共有三个方法需要实现,此处我们重点来关注一下getObject()方法
FactoryBean接口的作用:首先它是一个bean,但又不仅仅是一个bean。它是一个能生产或修饰对象生成的工厂bean,类似于设计模式中的工厂模式和装饰器模式。它能在需要的时候生产一个bean,且不仅仅限于它自身,它能返回任何bean的实例
FactoryBean
接口的详细分析:
https://www.cnblogs.com/guitu18/p/11284894.html
MapperFactoryBean中的getObject()
由于它实现了FactoryBean接口,我们重点关注它返回了什么东西?源码如下
首先看getSqlSession()方法是从哪里来的?
SqlSessionDaoSupport中的getSqlSession()
是MapperFactoryBean调用了其父类SqlSessionDaoSupport的方法,如下
你以为就这么简单的结束了,并不是,你有没有想过这个sqlSession是哪里来的?答案就在SqlSessionDaoSupport类中,源码如下
很明显,sqlSession指向的是子类对象,因为SqlSessionTemplate类实现了SqlSession接口。所以getSqlSession().getMapper()实际上调用的是SqlSessionTemplate的getMapper()的方法
SqlSessionTemplate中的getMapper()
我们继续跟近Configuration类的getMapper()方法看下里面做了什么
Configuration类的getMapper()
继续跟进MapperRegistry类中的getMapper()
MapperRegistry类中的getMapper()
显然,应该跟进mapperProxyFactory.newInstance()方法
MapperProxyFactory类中的newInstance()
从上面Proxy.newProxyInstance()的方法中,可以看出几点
- 这里最终返回的是一个
mapper接口对应的一个代理对象,是由MapperFactoryBean这个类来完成的,根本原因是MapperFactoryBean这个类实现了FactoryBean接口 - 因为第二个参数只能传接口数组,所以
mapperInterface是接口,也就是说数据映射器(mapper接口)只能是接口 MapperProxy类实现了InvocationHandler接口,具体的代理逻辑在它重写的invoke()方法中
我们继续跟进MapperProxy类的invoke()方法
MapperProxy类的invoke()
其中invoke()方法体是其代理逻辑,可以看到它最终的调用的是mapperMethod.execute()方法
相关新闻
- 2023-05-06 微pe怎么初始化U盘(微pe怎么恢复初
- 2023-05-06 Xp系统boot 进入pe(boot manager 怎么进入
- 2023-05-06 win pe修复bcdboot(pe修复系统)
- 2023-05-06 win7更新失败 pe(win7更新失败还原更
- 2023-05-06 u盘装了pe读取不了(u盘能进pe读取不
- 2023-05-06 u盘pe 发热(u盘发热烫手)
- 2023-05-06 u盘pe下看不到硬盘(u盘启动pe看不到
- 2023-05-06 pe盘 ntfs(u盘ntfs格式)
- 2023-05-06 sony笔记本进入pe模式(联想笔记本怎
- 2023-05-06 pe启动盘进不去(pe启动盘进不去系统
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
