一. Mapper.java 创建过程

在前面注册 bean 的时候, 对beanClass 进行了替换, 为 MapperFactoryBean. 那么创建实例的时候, 会调用 MapperFactoryBean 的 getObject() 方法得到实例.

  @Override
public T getObject() throws Exception {
return getSqlSession().getMapper(this.mapperInterface);
} public SqlSession getSqlSession() {
return this.sqlSession;
}

这里的的 sqlSession 就是 前面在配置类中创建的 SqlSessionTemplate 实例.

所以 getMapper 调用的就是 SqlSessionTemplate 的 getMapper 方法. 具体调用过程有点曲折, 最后会调用  MapperRegistry 的 getMapper 方法

  // SqlSessionTemplate.java
@Override
public <T> T getMapper(Class<T> type) {
return getConfiguration().getMapper(type, this);
} |
|
\|/

// Configuration.java
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
return mapperRegistry.getMapper(type, sqlSession);
} |
|
\|/

// MapperRegistry.java
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
if (mapperProxyFactory == null) {
throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
}
try {
return mapperProxyFactory.newInstance(sqlSession);
} catch (Exception e) {
throw new BindingException("Error getting mapper instance. Cause: " + e, e);
}
}

newInstance 调用的是  MapperProxyFactory 的方法:

  //MapperProxyFactory.java
public T newInstance(SqlSession sqlSession) {
final MapperProxy<T> mapperProxy = new MapperProxy<T>(sqlSession, mapperInterface, methodCache);
return newInstance(mapperProxy);
} protected T newInstance(MapperProxy<T> mapperProxy) {
return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
}

从这里可以看到, 对于 UserMapper.java 接口, 采用了 jdk代理 的方式来创建一个实例. 且代理处理类为:  MapperProxy

mybatis - mapper.java 的创建的更多相关文章

  1. Mybatis Mapper.java和Mapper.xml能否分离问题

    Mybatis Mapper.java和Mapper.xml是能分离的. 从图上不难看出,不管是/java还是/resources,他们最终编译后的存放路径均是/target/classes 因此将x ...

  2. mybatis Mapper.xml和Mapper.java

    mybatis Mapper.xml和Mapper.java 通过Mapper.xml和Mapper.java来实现mybatis.环境和入门的一样的.关键:Mapper.xml + Mapper.j ...

  3. MyBatis逆向工程生成配置 generator (生成pojo、mapper.xml、mapper.java)

    MyBatis逆向工程生成 mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java.mapper.xml ...

  4. mybatis mapper.xml 写关联查询 运用 resultmap 结果集中 用 association 关联其他表 并且 用 association 的 select 查询值 报错 java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for mybatis.map

    用mybaits 写一个关联查询 查询商品表关联商品规格表,并查询规格表中的数量.价格等,为了sql重用性,利用 association 节点 查询 结果并赋值报错 商品表的mapper文件为Gooo ...

  5. Java DB 访问之 mybatis mapper xml 配置方式

    1 项目说明 项目采用 maven 组织 ,jdbc 唯一的依赖就是 mysql-connector-java pom 依赖如下: mysql 数据连接 : mysql-connector-java ...

  6. Cause: java. lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider

    相信现在Java Web开发都是用的mybatis吧,而用到mybatis很多人都不会错过通用mapper吧! (纯属瞎扯淡...qwq). 如我上一篇博客所写,目前公司新项目,使用了通用mapper ...

  7. java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.SpecialProvider.<init>()

    Caused by: org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis ...

  8. spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录。如果不放置在根目录下,将会提示 no mybatis mapper was found

    spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录.将会将同一目录下的包扫描成bean. 如果不放置在根目录下,将会提示 no mybatis map ...

  9. 解决java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider

    今天在集成Mapper时 出现如下错误 java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvi ...

随机推荐

  1. C#简单鼠标键盘钩子KMHook

    简介:由三个文件构成Pinvo.cs.KeyboardHook.cs.MouseHook.cs Pinvo.cs 是KeyboardHook与MouseHook需要的一些常量消息的定义 Keyboar ...

  2. 0009 注册登录(第二步:获取短信接口access token)

    1 在GeneralTools目录下创建一个常量文件Constants.py 获取短信验证之前需要申请腾讯云短信服务. """ 腾讯云短信相关常量 "" ...

  3. day22 用户添加相关命令 特殊权限为 防止root修改文件

    2) 用户相关的命令 useradd -u -g -G -M -s -c usermod -u -g -G -s -c userdel -r groupadd groupmod groupdel ch ...

  4. 回顾 Monty Hall (三门问题)

    一.问题描述 Monty Hall Problem 源于美国的一档电视节目<Let's Make a Deal>,其中Monty Hall 是这个节目的主持人. 节目中有三扇门1.2.3, ...

  5. 素问 - 使用 PE、PB 做估值

    摘自<小韭的学习圈> Q 哪些行业用PE看合适,哪些用PB看合适啊?其中的大致逻辑是什么? A PE = 股价 / 每股收益 使用PE的逻辑是,我们认为一个股票有价值,是因为公司未来能赚钱 ...

  6. 原来window 也可以使用pthreads

    https://blog.csdn.net/clever101/article/details/101029850

  7. RemoteViews 整理

    前言 RemoteViews表面意思就是远程的view,这个就很难理解了,远程的view.但是英语是抽象,remote本身就是偏僻的,偏远的意思. 所以remoteViews 就是地方view,天高皇 ...

  8. Educational Codeforces Round 76 (Rated for Div. 2) D. Yet Another Monster Killing Problem

    You play a computer game. In this game, you lead a party of mm heroes, and you have to clear a dunge ...

  9. 常用bat脚本整理

    在当前文件夹下 shift +鼠标右键 打开终端   输入 tree /f > 1.txt 则将文件夹下的文件名放入1.txt文件中.不包含绝对路径. 要么是写个.bat文件,文件内容为 dir ...

  10. 题解【洛谷P1841】[JSOI2007]重要的城市

    题面 题解 最短路图模板题. 介绍一下最短路图: 先对原图跑一边单源最短路,求出源点到每个点\(i\)的最短路\(dis[i]\). 接下来构建新图:对于一条边\((x,y,v)\),若\(dis[x ...