面试官:MyBatis你只写了接口为啥就能执行SQL啊?

点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

每天 14:00 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:www.toutiao.com/
i6711153790793286152

7f94dc4bd44908f57b18af9eed3a5e84.png


一、静态代理

又是一年秋招季,很多小伙伴开始去大城市打拼。来大城市第一件事就是租房,免不了和中介打交道,因为很多房东很忙,你根本找不到他。从这个场景中就可以抽象出来代理模式:

  • ISubject:被访问者资源的抽象

  • SubjectImpl:被访问者具体实现类(房东)

  • SubjectProxy:被访问者的代理实现类(中介)

UML图如下:

00ddef1a6cb64155c68aaea5c8488155.png

举个例子来理解一下这个设计模式:

老板让记录一下用户服务的响应时间,用代理模式来实现这个功能。

c49dfc8f20009949ee4ad7b6ae1d515b.png 3fd00f116b623918c77f4e1d180d6573.png 900df5c64aa795374af56b762cf6fe55.png

一切看起来都非常的美好,老板又发话了,把产品服务的响应时间也记录一下吧。又得写如下3个类:

IProductServiceProductServiceImplProductServiceProxy

UserServiceProxy和ProductServiceProxy这两个代理类的逻辑都差不多,却还得写2次。其实这个还好,如果老板说,把现有系统的几十个服务的响应时间都记录一下吧,你是不是要疯了?这得写多少代理类啊?

推荐下自己做的 Spring Boot 的实战项目:

https://github.com/YunaiV/ruoyi-vue-pro

二、动态代理

黑暗总是暂时的,终究会迎来黎明,在JDK1.3之后引入了一种称之为动态代理(Dynamic Proxy)的机制。使用该机制,我们可以为指定的接口在系统运行期间动态地生成代理对象,从而帮助我们走出最初使用静态代理实现AOP的窘境

动态代理的实现主要由一个类和一个接口组成,即java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。

让我们用动态代理来改造一下上面记录系统响应时间的功能。虽然要为IUserService和IProductService两种服务提供代理对象,但因为代理对象中要添加的横切逻辑是一样的。所以我们只需要实现一个InvocationHandler就可以了。代码如下

b0a6a0f1fd0346d9d056bd08b065922f.png

UML图如下。恭喜你,你现在已经理解了Spring AOP是怎么回事了,就是这么简单,今天先不展开谈Spring

554a58cde87f3a2f42cf0906f7696d32.png

先简单谈谈动态代理在Mybatis中是如何被大佬玩的出神入化的

推荐下自己做的 Spring Cloud 的实战项目:

https://github.com/YunaiV/onemall

三、Mybatis核心设计思路

相信用过mybatis的小伙伴都能理解下面这段代码,通过roleMapper这个接口直接从数据库中拿到一个对象

Role role = roleMapper.getRole(3L);

直觉告诉我,一个接口是不能运行的啊,一定有接口的实现类,可是这个实现类我自己没写啊,难道mybatis帮我们生成了?你猜的没错,mybatis利用动态代理帮我们生成了接口的实现类,这个类就是:

org.apache.ibatis.binding.MapperProxy,

我先画一下UML图,MapperProxy就是下图中的SubjectProxy类

bf5606e521878959ce4680771a46200e.png

和上面的UML类图对比一下,发现不就少了一个SubjectImpl类吗?那应该就是SubjectProxy类把SubjectImple类要做的事情做了呗,猜对了。SubjectProxy通过SubjectImple和SubjectImple.xml之间的映射关系知道自己应该执行什么SQL。所以mybatis最核心的思路就是这么个意思,细节之类的可以看源码,理清最主要的思路,看源码就能把握住重点。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

843c4a2aa6df9b289f32cf39af2c78a1.png

已在知识星球更新源码解析如下:

82d85838afa671ef1812b2822b9935f7.png

a7401eb5b45e86a7d145993eb00fbfd6.png

2538674c2b0adbda6118e9a33b3a45f4.png

739f43067bcc0a83ccff340bbbe430b9.png

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值