作用

  1. 控制mybatis的行为
  2. 作为容器存放TypeHandler、TypeAlias、Mapper接口及Mapper SQL配置信息
  3. 作为Executor、StatementHandler、ResultSetHandler、ParameterHandler组件的工厂类,用于创建这些组件的实例

    源码简析

    控制mybatis的行为

    image.png
    image.png
    我们看到控制mybatis行为是通过将配置文件的信息读入到configuration中,并赋值为成员变量存储

    作为容器存放TypeHandler、TypeAlias、Mapper接口及Mapper SQL配置信息

    image.png
    我们看到这类的存储都是以注册的方式实现

    工厂类作用

    这类方法主要是以newXXX开头

    创建Executor

    image.png
    我们看到executorType有一个默认值
    image.png
    我们看到如果cacheEnabled配置项为true时,就会对executor进行包装。这是包装设计模式的具体应用。

    创建ParameterHandler、ResultSetHandler、StatementHandler

    image.png
    我们看到在创建完Executor、ParamterHandler、ResultSetHandler、StatementHandler之后都调用了pluginAll()方法。那么这个方法到底是在干什么呢?
    这个方法其实是在判断拦截器的声明中(@Interceptor{@Signature()})有没有拦截Exeutor、ParamterHandler、ResultSetHandler、StatementHandler中的方法或父类的方法,如果拦截了,则创建动态代理对象返回并记录拦截的方法,如果没有则返回原对象。

    关于拦截器的责任链模式应用,详情参看https://www.yuque.com/docs/share/a0a5e6fc-8875-47c3-9aad-0b383888de9c?# 《【1】InterceptorChain》