一文带你了解Mybatis设计模式之代理模式

1,330 阅读2分钟

这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战

Mybatis设计模式之代理模式

基本概念

代理模式(Proxy Pattern):给某⼀个对象提供⼀个代理,并由代理对象控制对原对象的引⽤。代理模式的英⽂叫做Proxy,它是⼀种对象结构型模式,代理模式分为静态代理和动态代理,我们来介绍动态代理

举例:

(1)创建⼀个抽象类,Person接⼝,使其拥有⼀个没有返回值的doSomething⽅法。

image.png

(2)创建⼀个名为Bob的Person接⼝的实现类,使其实现doSomething⽅法

image.png

(3) 创建JDK动态代理类,使其实现InvocationHandler接⼝。拥有⼀个名为target的变量,并创建getTarget获取代理对象⽅法

image.png

创建JDK动态代理测试类J DKDynamicTest

image.png

Mybatis中实现

代理模式可以认为是Mybatis的核⼼使⽤的模式,正是由于这个模式,我们只需要编写Mapper.java接 ⼝,不需要实现,由Mybati s后台帮我们完成具体SQL的执⾏。 当我们使⽤Configuration的getMapper⽅法时,会调⽤mapperRegistry.getMapper⽅法,⽽该⽅法⼜会调⽤ mapperProxyFactory.newInstance(sqlSession)来⽣成⼀个具体的代理:

image.png

在这⾥,先通过T newInstance(SqlSession sqlSession)⽅法会得到⼀个MapperProxy对象,然后调⽤T newInstance(MapperProxy mapperProxy)⽣成代理对象然后返回。⽽查看MapperProxy的代码,可以看到如下内容:

image.png

⾮常典型的,该MapperProxy类实现了InvocationHandler接⼝,并且实现了该接⼝的invoke⽅法。通 过这种⽅式,我们只需要编写Mapper.java接⼝类,当真正执⾏⼀个Mapper接⼝的时候,就会转发给MapperProxy.invoke⽅法,⽽该⽅法则会调⽤后续的sqlSession.cud>executor.execute>prepareStatement 等⼀系列⽅法,完成 SQL 的执⾏和返回。 至此Mybatis使用的代理模式就简单介绍完毕,Mybatis中还有很多地方使用到啦代理模式,需要自己尝试阅读源码去发现。