专栏首页冰河技术MyBatis源码分析之——面试官问我如何获得Mapper对象?我是这样说的!

MyBatis源码分析之——面试官问我如何获得Mapper对象?我是这样说的!

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:

https://github.com/sunshinelyz/mykit-delay

PS: 欢迎各位Star源码,也可以pr你牛逼哄哄的代码。

咱们直入主题,分析源码吧!从获取Mapper开始吧。

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
public <T> T getMapper(Class<T> type) {
    return configuration.getMapper(type, this);
}

mapperRegistry.getMapper是从MapperRegistry的knownMappers里面取的,knownMappers里面存的是接口类型(interface mapper.UserMapper)和工厂类(MapperProxyFactory)。

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    return mapperRegistry.getMapper(type, sqlSession);
}

从knownMappers的Map里根据接口类型(interface mapper.UserMapper)取出对应的工厂类

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);
  }
}
public T newInstance(SqlSession sqlSession) {
  final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession, mapperInterface, methodCache);
  return newInstance(mapperProxy);
}

这里通过JDK动态代理返回代理对象MapperProxy。

protected T newInstance(MapperProxy<T> mapperProxy) {
  //mapperInterface是interface mapper.UserMapper
  return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
}

本文分享自微信公众号 - 冰河技术(hacker-binghe),作者:冰河团队

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 原来Java是这样实现微信小程序加密与解密数据算法的!超赞的有木有?!

    微信推出了小程序,很多公司的客户端应用不仅具有了APP、H5、还接入了小程序开发。但是,小程序中竟然没有提供Java版本的加密数据解密算法。这着实让广大的Jav...

    冰河
  • 卧槽,运行Docker容器时磁盘空间满了怎么办?

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了...

    冰河
  • 我搭建了一套企业级私有Git服务,抗住了每天上万次攻击!

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了...

    冰河
  • Java工具集-复杂更新逻辑工具

    cwl_java
  • 面试题26(对字母进行排序,如:s,a,g,d,b; 控制台输入 a b d g s)

    对字母进行排序,如:s,a,g,d,b; 控制台输入 a b d g s import java.util.ArrayList; import java.uti...

    Java学习
  • 第二节,Vuex生成Store并映射数据到view视图层

    (1)通过辅助函数mapGetters,从vuex的getters中获得state里面的数据,

    web前端教室
  • JavaScript 全栈工程师培训教程

    我现在的技术方向,前端是 React,后端是 Node,时间都投入在这两方面。 最近有一种感觉,我可以融汇贯通了,使用 JavaScript 全栈解决各种问题。...

    ruanyf
  • 来仿一仿retrofit

    为什么要重复造轮子 在开发领域有一句很流行的话就是不要重复造轮子,因为我们在开发中用到的很多东西早已有很多人去实现了,而且这些实现都是经过时间和开发者检验过的,...

    企鹅号小编
  • 聊聊sharding-jdbc的XAConnectionWrapper

    本文主要研究一下sharding-jdbc的XAConnectionWrapper

    codecraft
  • 聊聊sharding-jdbc的XAConnectionWrapper

    本文主要研究一下sharding-jdbc的XAConnectionWrapper

    codecraft

扫码关注云+社区

领取腾讯云代金券