MyBatis源码解读

从启动Springboot项目,MyBatis就开始工作了

首先,MyBatis通过SqlSessionFactoryBuilder来创建SqlSessionFatory,生命周期在创建完SqlSessionFactory后结束。

SqlSessionFactory用于创建SqlSession,是单例模式,生命周期存在于整个MyBatis中。

SqlSession相当于JDBC的Connection对象,他的生命周期在请求数据库处理事务的过程中,并且线程不安全。

此处SqlSessionFactoryBuilder、使用了两处工厂模式。

此处重点介绍下MyBatis的映射器Mapper源码和MyBatis的插件源码:

Mapper源码分析:

1、MapperProxyFactory将所有mapper接口绑定给MapperProxy上,执行mapper接口时实际上时调用MapperProxy的invoke方法(MapperProxy应该要实现InvocationHandler接口),从中可以看出MyBatis是使用JDK自带的动态代理方法。绑定使用了Proxy.newProxyInstance()方法并接收三个参数:

loder,选用的类加载器。

interfaces,被代理的类所实现的接口,这个接口可以是多个。

h,绑定代理类的一个方法。在这里是MapperProxy类的invoke方法

2、MapperProxy的invoke方法接收三个参数,分别是:

proxy,代理后的实例对象。在此处是MapperProxy

method,对象被调用方法。就是mapper接口的方法。

args,调用时的参数。

3、项目调用Mapper接口方法,被动态代理到MapperProxy的invoke方法,执行的是MapperMethod的execute方法。

MyBatis的插件源码分析:

首先,MyBatis的四大基础对象Executor、StatementHandler、ParameterHandler、ResultSetHandler都是从Configuration类获取的,在获取时Configuration会根据项目的插件情况给四大对象配置插件,代码如下:

第一步,获取四大对象

获取Executor
获取StatementHandler,ParameterHandler、ResultSetHandler

第二步,使用interceptorChain将四大对象交给插件进行代理

 target = interceptor.plugin(target)这行代码很关键,就是这行代码实现了责任链,同一个类可以被多个插件代理。

使用pluginAll绑定所有需要的插件

第三步,使用插件的plugin方法,将对象传递给插件,插件返回新的代理类

使用plugin生成新的代理类


附:

SqlSession是代理模式,通过SqlSession调用Executor

execute使用了命令模式,好处是将请求方和解决方两者解耦。

StatementHandler使用了接口适配器模式

typeHandler在ParameterHandler和ResultSetHandler中调用

SqlSession四大对象是典型的职责链设计模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。