上一章说了,既然mybatis获取Mapper的时候使用的是代理,那么我们是否可以模拟实现一下。
话不多说上代码;
这样就更加清楚mapper的代理实现过程了吧。

public class MySqlSession {public static Object getMapper(Class clazz){ClassLoader classLoader = MySqlSession.class.getClassLoader();Class[] classes = {clazz};Object proxy = Proxy.newProxyInstance(classLoader, classes, new MyTestInvocationHandler());return proxy;}static class MyTestInvocationHandler implements InvocationHandler{@Overridepublic Object invoke(Object o, Method method, Object[] args) throws Throwable {//这个是判断要执行的方法是在Object声明的方法,// 比如toString这种,就不需要我们通过代理实现if(method.getDeclaringClass().equals(Object.class)){method.invoke(this, args);}Select select = method.getAnnotation(Select.class);//取出@select注解中的sql语句。数组是因为注解中可以写多条sql语句String sql = select.value()[0];System.out.println("假装连接数据库");System.out.println("假装执行了查询语句"+sql);System.out.println("假装返回了JSON串");return null;}}}@Testpublic void customBatis(){TMapper tMapper = (TMapper)MySqlSession.getMapper(TMapper.class);tMapper.queryMap("1");}//打印结果
假装连接数据库
假装执行了查询语句select * from t where id = ${id}
假装返回了JSON串

有些同学会发散思维了,说既然这个我们可以实现,那是不是我们可以自己开发一个mybatis框架来让市面上的人使用呢。
可以,但是要解决一些问题,比如这个:
我们都知道在service中调用mapper的时候,是通过Autowired来进行注入的,但是你这个mapper是在使用的时候才通过代理对象生成,那么spring在初始化的时候找不到这个mapper,注入不了必定是要报错的。
问题就是:如何将一个第三方的对象注入到Spring呢?

spring源码之模拟mybatis获取Mapper相关推荐

  1. spring源码之模拟mybatis第三方对象注入

    有下面几种方法 注解(@Service) XML方式 注解(@Bean) factoryBean spring 容器api 动态向容器注册beanDefinition 看到这几种方式的时候,需要我们自 ...

  2. Spring源码 - 从缓存中获取单例Bean

    # Spring源码 - 从缓存中获取单例Bean Spring版本:Spring 5.3.13-release # 1.从缓存中获取单例Bean 单实例Bean在Spring的同一个容器中只会创建一 ...

  3. Spring源码之getBean(获取 bean)方法(二)解读

    目录 前言 `spring` 初始化 `bean` 过程 进入类 `ClassPathXmlApplicationContext` 的构造器 `AbstractApplicationContext` ...

  4. Spring源码学习1.4 获取XML的验证模式

    Spring5源码分析(008)--IoC篇之加载BeanDefinition:获取XML的验证模式 -- 转载 注:<Spring5源码分析>汇总可参考:Spring5源码分析(002) ...

  5. 还觉得看spring源码脑壳痛?掌握这套方法,阿里大门向你敞开!

    目录 前言 Spring源码学习方法 1.通读Spring官方文档 2.如何正确阅读Spring源码 3.尽情去调试Spring吧 Spring核心技术知识 Spring大厂面试真题 金九银十全套面试 ...

  6. Spring源码分析八:Mybatis ORM映射框架原理

    文章目录 (一)Mybatis单独操作数据库程序 1.1.数据库表 1.2.建立PO 1.3.建立mapper接口映射 1.4.建立Mybatis配置文件 1.5.建立mapper映射文件 1.6.测 ...

  7. 《Spring源码深度解析 郝佳 第2版》JDBC、MyBatis原理

    往期博客 <Spring源码深度解析 郝佳 第2版>容器的基本实现与XML文件的加载 <Spring源码深度解析 郝佳 第2版>XML标签的解析 <Spring源码深度解 ...

  8. Spring源码深度解析(郝佳)-学习-源码解析-Spring整合MyBatis

    了解了MyBatis的单独使用过程之后,我们再来看看它也Spring整合的使用方式,比对之前的示例来找出Spring究竟为我们做了什么操作,哪些操作简化了程序开发. 准备spring71.xml &l ...

  9. spring源码学习之整合Mybatis原理分析

    本文主要解析spring是如何与mybatis进行整合,整合的过程中需要哪些组件的支持.以前面提到过的配置例子<spring源码学习之aop事物标签解析> 整合的过程中需要使用以下这个依赖 ...

最新文章

  1. (三十一)java多线程二
  2. web前端技术框架选型参考
  3. 10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据
  4. hdu 5340(manacher+枚举)
  5. VTK:几何对象之Planes
  6. 【C语言】Linux内核源码--min,swap宏定义
  7. 移动端媒体尺寸_网络推广外包浅析提升移动端网站建设效率有哪些网络推广外包技巧...
  8. 集成Android免费语音合成功能(在线、离线、离在线融合),有这一篇文章就够了(离线)
  9. 关于python项目路径导入自己写的库出错的一点思考
  10. ABB码垛算法程序与设计接口参考案例
  11. html图片随圆点下标轮播,基于JavaScript实现轮播图代码
  12. ffmpeg的一些用法,不定期更新
  13. KEGG Pathway通路二级分类汇总,轻松找到感兴趣的通路
  14. 微信lbs开发java_微信LBS获取
  15. 安卓中压缩纹理ETC1和ETC2
  16. 基于python实现resnet_【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控...
  17. 你可能已经被运营商http劫持了
  18. 解决Win7系统插入耳机或音响没有声音教程
  19. Koa洋葱圈模型源码浅析(`await next()`为什么能够形成洋葱圈模型?)
  20. Android日期加任意天数计算方式

热门文章

  1. 数据库——常用SQL语句的总结
  2. 大白鲨 LED 拆机
  3. 服务器ibmc无法加载js文件,华为服务器IBMC批量巡检代码
  4. 车路协同全域感知与数据融合
  5. 浅谈国内图形学教育现状
  6. Java NIO之 直接缓冲区与非直接缓冲区
  7. Hexo个人免费博客(三) next主题、评论、阅读量统计和站内搜索
  8. 人生如水,由溪入海(写给即将毕业的大学生)
  9. 这24款效率办公神器,挺强的~
  10. 4.Redis最佳实践