U盘PE| w764位旗舰版下载 | U盘装win7系统 | U盘启动 |win7pe | win10下载 |加入收藏土豆PE官网U盘PE,U盘装win7系统,win7pe,U盘启动,U盘装系统,w764位旗舰版下载站!
当前位置:主页 > 帮助中心 > 土豆PE使用教程 >

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()实际上调用的是SqlSessionTemplategetMapper()的方法

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()方法

Copyright © 2012-2014 Www.tudoupe.Com. 土豆启动 版权所有 意见建议:tdsky@tudoupe.com

土豆系统,土豆PE,win7系统下载,win7 64位旗舰版下载,u盘启动,u盘装系统,win10下载,win10正式版下载,win10 RTM正式版下载,win8下载,电脑蓝屏,IE11修复,网络受限,4K对齐,双系统,隐藏分区,系统安装不了,U盘装系统,笔记本装系统,台式机装系统,diskgenius运用,GHSOT装系统,U盘修复,U盘技巧,U盘速度,U盘不能格式化,U盘复制发生错误,U盘加密,U盘选购,开机黑屏,蓝屏,进不了系统,上不了网,打不开程序,点击无反应,系统设置,PE个性化,PE添加网络,PE维护系统

点击这里给我发消息