Mybatis源码研究之@SelectProvider系列注解

在刚接触到Mybatis时候,对于Mybatis提供的接口方式调用Mybatis映射文件感到十分地神奇,本文将尝试解开其神秘面纱。

1. 相关配置

首先让我们来看看Mybatis里的相关配置,依然是只贴出关键性的:

<configuration>
	...
	<mappers>
		
		<package name="mybatis.theory.annotation"/>
	mappers>
configuration>

2. 源码分析

按照之前的研究,我们知道在Mybatis内部,对于XML配置文件的解析工作是从XMLConfigBuilder开始的,而解析上述配置的准确位置则是位于方法mapperElement()中:

  1. XMLConfigBuilder.mapperElement()方法中Mybatis将最终调用辅助类MapperRegistryaddMappers()方法。
  2. MapperRegistry.addMappers()方法中,Mybatis将遍历出其下所有的接口类型,对于每个接口类型,将完成以下两项重要操作。
    a. 对于每个接口类型都使用一个MapperProxyFactory进行封装。
    b. 使用辅助类MapperAnnotationBuilder来完成每个接口类型的解析工作。
2.1 MapperProxyFactory

此类只看名字就能猜到是个工厂模式,用于构建MapperProxy实例。通过观察MapperProxyFactory类的核心方法newInstance()(其中直接调用了JDK中的Proxy.newProxyInstance()方法),以及相关的MapperProxy类(其直接实现了我们非常熟悉的InvocationHandler接口)。

也正是MapperProxyFactoryMapperProxy的相互合作,使得我们可以以强类型的方式调用Mybatis映射文件中的sqlId

2.2 MapperAnnotationBuilder

MapperAnnotationBuilder 中,核心逻辑为 parse()方法,而其逻辑大致分为两个部分:
a. 加载接口相匹配的映射文件loadXmlResource()方法。
b. parseStatement()方法解析采用注解方式配置的SQL语句,此部分逻辑,和Mybatis中负责解析XML映射文件中的每个