spring源码之模拟mybatis获取Mapper
上一章说了,既然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相关推荐
- spring源码之模拟mybatis第三方对象注入
有下面几种方法 注解(@Service) XML方式 注解(@Bean) factoryBean spring 容器api 动态向容器注册beanDefinition 看到这几种方式的时候,需要我们自 ...
- Spring源码 - 从缓存中获取单例Bean
# Spring源码 - 从缓存中获取单例Bean Spring版本:Spring 5.3.13-release # 1.从缓存中获取单例Bean 单实例Bean在Spring的同一个容器中只会创建一 ...
- Spring源码之getBean(获取 bean)方法(二)解读
目录 前言 `spring` 初始化 `bean` 过程 进入类 `ClassPathXmlApplicationContext` 的构造器 `AbstractApplicationContext` ...
- Spring源码学习1.4 获取XML的验证模式
Spring5源码分析(008)--IoC篇之加载BeanDefinition:获取XML的验证模式 -- 转载 注:<Spring5源码分析>汇总可参考:Spring5源码分析(002) ...
- 还觉得看spring源码脑壳痛?掌握这套方法,阿里大门向你敞开!
目录 前言 Spring源码学习方法 1.通读Spring官方文档 2.如何正确阅读Spring源码 3.尽情去调试Spring吧 Spring核心技术知识 Spring大厂面试真题 金九银十全套面试 ...
- Spring源码分析八:Mybatis ORM映射框架原理
文章目录 (一)Mybatis单独操作数据库程序 1.1.数据库表 1.2.建立PO 1.3.建立mapper接口映射 1.4.建立Mybatis配置文件 1.5.建立mapper映射文件 1.6.测 ...
- 《Spring源码深度解析 郝佳 第2版》JDBC、MyBatis原理
往期博客 <Spring源码深度解析 郝佳 第2版>容器的基本实现与XML文件的加载 <Spring源码深度解析 郝佳 第2版>XML标签的解析 <Spring源码深度解 ...
- Spring源码深度解析(郝佳)-学习-源码解析-Spring整合MyBatis
了解了MyBatis的单独使用过程之后,我们再来看看它也Spring整合的使用方式,比对之前的示例来找出Spring究竟为我们做了什么操作,哪些操作简化了程序开发. 准备spring71.xml &l ...
- spring源码学习之整合Mybatis原理分析
本文主要解析spring是如何与mybatis进行整合,整合的过程中需要哪些组件的支持.以前面提到过的配置例子<spring源码学习之aop事物标签解析> 整合的过程中需要使用以下这个依赖 ...
最新文章
- (三十一)java多线程二
- web前端技术框架选型参考
- 10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据
- hdu 5340(manacher+枚举)
- VTK:几何对象之Planes
- 【C语言】Linux内核源码--min,swap宏定义
- 移动端媒体尺寸_网络推广外包浅析提升移动端网站建设效率有哪些网络推广外包技巧...
- 集成Android免费语音合成功能(在线、离线、离在线融合),有这一篇文章就够了(离线)
- 关于python项目路径导入自己写的库出错的一点思考
- ABB码垛算法程序与设计接口参考案例
- html图片随圆点下标轮播,基于JavaScript实现轮播图代码
- ffmpeg的一些用法,不定期更新
- KEGG Pathway通路二级分类汇总,轻松找到感兴趣的通路
- 微信lbs开发java_微信LBS获取
- 安卓中压缩纹理ETC1和ETC2
- 基于python实现resnet_【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控...
- 你可能已经被运营商http劫持了
- 解决Win7系统插入耳机或音响没有声音教程
- Koa洋葱圈模型源码浅析(`await next()`为什么能够形成洋葱圈模型?)
- Android日期加任意天数计算方式