『手撕 Mybatis 源码』07 - Proxy 对象创建

news2024/9/22 15:47:51

Proxy 对象创建

  1. 问题
  • sqlSession.getMapper(UserMapper.class) 是如何生成的代理对象?
  1. Mapper 代理方式初始化完成后,下一步进行获取代理对象来执行
public class MybatisTest {
  /**
   * 问题2:sqlSession.getMapper(UserMapper.class); 是如何生成的代理对象?
   * 解答:(T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
   *       使用的就是 JDK 动态代理
  **/
  @Test
  public void test2() throws IOException {
    ...
    // 1. JDK 动态代理生成代理对象,就是这里
    UserMapper mapperProxy = sqlSession.getMapper(UserMapper.class);
    ...
  }
}
  1. 当调用 getMapper() 时,DefaultSqlSession 实际会委托 Configuration 来获取 Mapper 代理对象
public class DefaultSqlSession implements SqlSession {
  
  private final Configuration configuration;
  ...
  @Override
  public <T> T getMapper(Class<T> type) {
    // 从 Configuration 对象中,根据 Mapper 接口,获取 Mapper 代理对象
    return configuration.getMapper(type, this);
  }
}
  1. Configuration 对象又会通过 MapperRegistry 获取 Mapper 代理对象
public class Configuration {
  
  protected final MapperRegistry mapperRegistry = new MapperRegistry(this);
  ...
  public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    return mapperRegistry.getMapper(type, sqlSession);
  }
}
  1. MapperRegistry 中,会通过 knownMappers 获取 Mapper 代理对象工厂,然后通过 Mapper 代理对象工厂生成 Mapper 代理对象
public class MapperRegistry {

  private final Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap<>();
  ...
  public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    // 1. 根据 Mapper 接口的类型,从 Map 集合中获取 Mapper 代理对象工厂
    final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
    if (mapperProxyFactory == null) {
      throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
    }
    try { 
      // 2. 通过 MapperProxyFactory 生产 MapperProxy,通过 MapperProxy 产生 Mapper 代理对象
      return mapperProxyFactory.newInstance(sqlSession);
    } catch (Exception e) {
      throw new BindingException("Error getting mapper instance. Cause: " + e, e);
    }
  }
}
  1. MapperProxyFactory 会创建MapperProxy 对象,封装相应参数,然后使用 JDK 动态代理方式,生成代理对象
public class MapperProxyFactory<T> {

  private final Class<T> mapperInterface;
  private final Map<Method, MapperMethodInvoker> methodCache = new ConcurrentHashMap<>();
  ...
  @SuppressWarnings("unchecked")
  protected T newInstance(MapperProxy<T> mapperProxy) {
    // 2. 使用 JDK 动态代理方式,生成代理对象
    return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
  }

  public T newInstance(SqlSession sqlSession) {
    // 1. InvocationHandler 接口的实现类
    final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession, mapperInterface, methodCache);
    return newInstance(mapperProxy);
  }
}
  1. 总结
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EMC学习笔记(五)传输线模型及反射、串扰

1.概述 在高速数字电路PCB设计中&#xff0c;当布线长度大于20分之一波长或信号延时超过6分之一信号上升沿时&#xff0c;PCB布线可被视为传输线。传输线有两种类型:微带线和带状线。与EMC设计有关的传输线特性包括:特征阻抗、传输延迟、固有电容和固有电感。反射与串扰会影响…

2023年第1季社区Task挑战赛贡献者榜单

基于数字身份凭证的业务逻辑设计&#xff0c;贡献了发放数字身份凭证的参考实现&#xff1b;提供企业碳排放、慈善公益等智能合约库业务场景案例&#xff1b;体验最新发布的WeCross-BCOS3-Stub&#xff0c;跟社区核心开发者碰撞想法并给出自己的见解……这些精彩贡献展现出社区…

<C++项目>高并发内存池

项目介绍&#xff1a; 原型是goole的开源项目tcmalloc(全称:Thread-Caching Malloc),用于替代系统的内存分配相关的函数(malloc, free).知名度非常高。 项目要求知识储备和难度&#xff1a; 会用到C/C、数据结构(链表、哈希桶)、操作系统内存管理、单例模式、多线程、互斥锁等等…

设计模式—“行为变化”

在组件构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。 典型模式有:Command、Visitor 一、Command 动机 在软件构建过程中,"行为请求者"与“行为实现…

看完这篇,立马看懂理想首款纯电MEGA

作者 | 马波编辑 | 德新 6月17日&#xff0c;理想召开了首届家庭科技日活动。 这场打着家庭幌子的科技发布会&#xff0c;信息密度高到有些超出预期。但是看完这场发布会&#xff0c;理想超级旗舰车型 W01&#xff0c;也就是同时在本场发布会公布名称的理想MEGA&#xff0c;它…

硅谷之火重燃武大

关注、星标公众号&#xff0c;直达精彩内容 来源&#xff1a;技术让梦想更伟大 作者&#xff1a;李肖遥 昨天看到雷军雷总在武汉大学的毕业典礼上&#xff0c;朴实的演讲&#xff0c;看似吹牛&#xff0c;实则也是一种勉励。 雷军大学一年级时&#xff0c;在武大图书馆看到一本…

基于java,springboot的音乐分享平台

背景 音乐网站与分享平台的主要使用者分为管理员和用户&#xff0c;实现功能包括管理员&#xff1a;首页、个人中心、用户管理、音乐资讯管理、音乐翻唱管理、在线听歌管理、留言板管理、系统管理&#xff0c;用户&#xff1a;首页、个人中心、音乐翻唱管理、我的收藏管理&…

MySQL - 单表数据量大表优化方案

一. 前言 当MySQL单表记录数过大时&#xff0c;增删改查性能都会急剧下降&#xff0c;可以参考以下步骤来优化。 二. 单表优化 除非单表数据未来会一直不断上涨&#xff0c;否则不要一开始就考虑拆分&#xff0c;拆分会带来逻辑、部署、运维的各种复杂度&#xff0c;一般以整…

软考:软件工程:软件开发与测试,黑盒测试,白盒测试

软考&#xff1a;软件工程: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1&#…

年轻人的储蓄困境:愿望与现实的交锋(原因及解决之道)

年轻人存款难吗&#xff1f;探讨年轻人存款问题是目前社会热议的话题之一。最近的一项调查称&#xff0c;大约五分之一的年轻人存款在一万元以内&#xff0c;而存款超过10万元的年轻人只占总人数的53.7%。这一数据引发了广泛的关注和讨论&#xff0c;究竟是什么原因导致了年轻人…

基于开源项目二次开发KKPrinter实现打印机共享,远程跨网络实现不同网络打印机共享,客户端利用虚拟打印机截取打印文件转发至物理打印机(附源码)

基于开源项目二次开发KKPrinter实现打印机共享&#xff0c;远程跨网络实现不同网络打印机共享&#xff0c;客户端利用虚拟打印机截取打印文件转发至物理打印机&#xff08;附源码&#xff09;。实现方案有很多种&#xff0c;这里主要介绍 2 种&#xff0c;并附详细的实现过程和…

MySQL学习笔记之索引优化与查询优化

文章目录 前言数据准备建表创建函数插入数据创建删除索引函数 索引失效案例全值匹配最佳左前缀法则主键插入顺序计算、函数导致列索引失效函数导致索引失效计算导致索引失效 类型转换导致列索引失效范围条件右边的列索引失效不等于导致列索引失效is not null不能使用索引like以…

探索“AI+算力”:加速创新与增长的无限潜力

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术正成为各行各业的关注焦点。在这个充满激情和创新的时代&#xff0c;"AI算力"的结合应用成为科技行业的热门话题&#xff0c;甚至引发出"AI算力最强龙头"的网络热门等式。本文将探讨…

数据结构-哈希-哈希表实现

哈希表实现 一&#xff0c;哈希概念哈希概念常见哈希函数哈希冲突哈希冲突的解决 二&#xff0c;闭散列实现闭散列的结构插入查找删除闭散列总结 三&#xff0c;哈希桶实现哈希桶的结构插入查找删除析构拷贝构造赋值运算符重载 四&#xff0c;哈希表总结开散列与闭散列的比较哈…

设备虚拟化基础 - PCI

目录 1. 配置空间概念和作用 2. 通过配置空间发现设备 3. Linux读取PCI配置空间接口 4. 内核中具体读取配置空间实例 5. Virtion设备自定义空间 6. Linux读取Capabilities List代码解析 1. 配置空间概念和作用 详细的定义可以参考PCI Spec的第六章《Configuration Space…

嵌入式操作系统(嵌入式学习)

嵌入式操作系统 嵌入式操作系统是什么&#xff1f;嵌入式操作系统有哪些&#xff1f;常用的嵌入式操作系统及其特点对初学者的建议 嵌入式操作系统是什么&#xff1f; 嵌入式操作系统是一种专门设计和优化用于嵌入式系统的操作系统。它是在资源受限的嵌入式设备上运行的操作系…

No CMAKE_Swift_COMPILER could be found问题解决

编译OpenCV的IOS平台包,出错: CMake Error at CMakeLists.txt:20 (enable_language): No CMAKE_Swift_COMPILER could be found. 出错定位,原因是启用Swift语言时没有找到CMAKE_Swift_COMPILER变量 CMAKE官方文档说明启用Swift语言方法 cmake 3.15开始支持swift 查找swift …

简单介绍html/javascript、ajax应用

文章目录 前言1、html1.1.、html实例1.2、HTML文档的后缀名1.3、HTML 编辑器1.4、HTML 标题1.5、HTML 段落1.6、HTML 链接1.7、HTML 图像1.8、HTML 表格1.8.1、HTML 表格实例1.8.2、HTML 表格和边框1.8.3、HTML 表格表头 1.9、HTML <input> 标签1.10、Bootstrap 教程1.10…

开发常用命令合集(Docker、K8s、Linux、Windows等)

开发常用命令合集&#xff08;Docker、K8s、Linux、Windows等&#xff09; 1 Docker 详情查看&#xff1a;https://blog.csdn.net/weixin_45565886/article/details/130130361 1.1 基础命令 ①拉取、查看、删除镜像 docker pull nginx #下载最新版镜像名:版本名&#xff08…

元数据驱动架构的官方数据空间设计

淘宝开放平台是阿里与外部生态互联互通的重要开放途径&#xff0c;通过开放的产品技术把阿里经济体一系列基础服务&#xff0c;像水、电、煤一样输送给我们的商家、开发者、社区媒体以及其他合作伙伴&#xff0c;推动行业的定制、创新、进化, 并最终促成新商业文明生态圈。 开放…