MyBatis中的Configuration

521 阅读2分钟

Configuration类属于MyBatis比较重要的类。我们在使用MyBatis时的所有概念都能在Configuration中找到。

例如:

数据库连接信息,包含在Configuration的environment属性中。

我们定义的Mapper接口,包含在mapperRegistry属性里。

定义在Mapper XML文件中或使用注解定义的Sql语句,包含在mappedStatements内。

除此之外还有类型处理typeHandlerRegistry,返回类型管理的resultMaps等等。如果你深入Mybatis源码,源码中的很多类都保存着Configuration的引用。研究Configuration类,首先要研究的就是mapperRegistry。registry中文意思为登记处,我们可以将它理解为注册表,主要是用来保存信息的。大家可以记住这个单词,将来在其他的开源项目中也会遇到其他的Registry类。

MapperRegistry保存着我们在使用Mybatis是设计的所有Mapper接口信息。有了mapperRegistry信息,我们才可以通过sqlSession.getMapper方法获取到Mapper类。MyBatis是怎样注册Mapper到mapperRegistry中的呢?我们继续往下。

上文我已经介绍过从config.xml文件到Configuration类,MyBatis是使用XMLConfigBuilder来进行转化的,也就是调用了XMLConfigBuilder中的parse方法。从下图的源码可以看出,解析config文件中的mapper信息是通过mapperElement方法实现的。

如果继续往下看mapperElement方法,你将会发现实际上有2种方式去注册mapper到registry中,一种是直接调用configuration.addMapper(如果是指定的包名将调用addMappers)另一种是通过XMLMapperBuilder(从这个类的类名就可以推测这个类是构造Mapper的)。

从xml文件我们得到的mapper信息实际上是字符串的形式的,通过反射我们可以得到Class类型的对象。最终MyBatis用MapperProxyFactory将mapper的Class包裹起来保存在MapperRegistry内。

我们都知道在使用Mybatis时不需要定义是实现类,具体的实现是由MyBatis在运行时提供的。动态实现实现类那必然是使用到了Java的动态代理机制,Proxy.newProxyInstance。而这行代码就在MapperProxyFactory类中。接下来我将探究MapperProxyFactory包含了些什么。