Mybatis中getMapper方法源码解析

Mybatis中getMapper方法源码解析

前言:最近重看了一遍Mybatis,看到“UserDao userDao = sqlSession.getMapper(UserDao.class);”这行代码。我很好奇,为什么传一个Class类型,就能返回一个可以用的接口呢?

总体的

Mybatis中getMapper方法源码解析

红框的代码,会产生一个SqlSessionFactory,这个SqlSessionFactory携带着一个由Mybatis配置文件生解析而成的配置类(Configuration.java),这个配置类里就包含着已注册Mapper的信息。

Mybatis中getMapper方法源码解析

我们在调用getMapper()方法的时候会传一个Class类进去,这时,Configuration就会根据类型来匹配Mapper,这样就返回了相应的接口。

具体的

Mybatis中getMapper方法源码解析


Mybatis中getMapper方法源码解析

我们调用SqlSessionFactoryBuilder的build方法时,实际上是调用了多个重载方法中的一个,最后都会分发到第二个红框进行执行。方法里调用了一个XMLConfigBuilder,会对Mybatis的XML配置文件进行解析,返回一个Configuration,然后将其传给最后一个方法,构造一个SqlSessionFactory,到这里,SqlSessionFactory就已经掌握了所有Mapper的信息。

Mybatis中getMapper方法源码解析

我们调用getMapper()方法时,实际上是调用了SqlSession接口的方法,其下有两个实现类,我们看第一个,因为上面的代码中显式的创建了一个DefaultSqlSession,并将Configuration传入。

Mybatis中getMapper方法源码解析

DefaultSqlSession中的getMapper方法,实际上是调用的Configuration的getMapper方法

Mybatis中getMapper方法源码解析

而Configuration的getMapper方法又调用了MapperRegistry的同名方法。

Mybatis中getMapper方法源码解析
MapperRegistry的getMapper方法,根据类型进行匹配,匹配成功即返回对应的“类型”,这里是接口。