从启动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会根据项目的插件情况给四大对象配置插件,代码如下:
第一步,获取四大对象
第二步,使用interceptorChain将四大对象交给插件进行代理
target = interceptor.plugin(target)这行代码很关键,就是这行代码实现了责任链,同一个类可以被多个插件代理。
第三步,使用插件的plugin方法,将对象传递给插件,插件返回新的代理类
附:
SqlSession是代理模式,通过SqlSession调用Executor
execute使用了命令模式,好处是将请求方和解决方两者解耦。
StatementHandler使用了接口适配器模式
typeHandler在ParameterHandler和ResultSetHandler中调用
SqlSession四大对象是典型的职责链设计模式