在前边的博客在分析了mybatis解析settings标签,《mybatis源码配置文件解析之二:解析settings标签》。下面来看解析typeAliases标签的过程。
一、概述
在mybatis核心配置文件(mybatis-config.xml)中有关typeAliases的配置如下,
<typeAliases>
<package name="cn.com.mybatis.bean"></package>
<typeAlias name="user" type="cn.com.mybatis.bean.User"></typeAlias>
</typeAliases>
上面给出了两种配置typeAlias的放式,一种是配置package标签,一种是typeAlias表。
我上面的配置是有问题的,在测试的时候一直报下面的错误,
上面的问题困扰了笔者好久,没找到原因,因为解析typeAliases标签的源码中找不到任何的原因,最后排查日志,原来是在加载核心配置文件的时候要把配置和mybatis的dtd文件进行验证,这里是验证出错了,具体的错误是typeAlias标签必须在package标签的前边,也就是标签是有顺序的。把配置改为下面的顺序,程序正常,
<typeAliases>
<typeAlias alias="user" type="cn.com.mybatis.bean.User"></typeAlias>
<package name="cn.com.mybatis.bean"/>
</typeAliases>
1、配置<package>标签
<package>标签配置的是一个包名,mybatis会扫描该包下的所有类,并注册一个别名,这里在标签中无法为某个类指定一个自定义的别名,mybatis提供了另外一种方式可以使用自定义的别名,即@Alias注解,在类上标记该注解,如下,
package cn.com.mybatis.bean;
import org.apache.ibatis.type.Alias;
//配置别名为myMenu
@Alias(value="myMenu")
public class Menu {
private String menuId;
private String menuName;
private String url;
}
上面为Menu类配置了别名,在扫描该包的时候会使用自定义的别名,不会使用mybatis默认的别名规则(Class.getSimpleName())
2、配置<typeAlias>标签
这种配置是单独为某个类配置别名,其中alias属性可以不配置,不配置则使用mybatis默认的别名规则,如下
<typeAlias alias="MyUser" type="cn.com.mybatis.bean.User"></typeAlias>
上面看了typeAlias的两种配置方式,那么何为typeAlias,意思就是给一个类配置一个别名,如这里有一个cn.com.mybatis.bean.User类,可以为其配置别名为MyUser,
那么在配置文件中便可以使用别名代替类的全限类名,目的是简便。这里需要注意的是配置的别名的使用范围仅限于mybatis的配置文件中(包含核心配置文件和Mpper映射文件)
二、详述
上面,了解了typeAlias的配置及作用,下面看mybatis是如何解析的。
在XMLConfigBuilder类中的parseConfiguration方法,
private void parseConfiguration(XNode root) {
try {
//issue #117 read properties first
//解析properties标签
propertiesElement(root.evalNode("properties"));
//解析settings标签,1、把<setting>标签解析为Properties对象
Properties settings = settingsAsProperties(root.evalNode("settings"));
/*2、对<settings>标签中的<setting>标签中的内容进行解析,这里解析的是<setting name="vfsImpl" value=",">
* VFS是mybatis中用来表示虚拟文件系统的一个抽象类,用来查找指定路径下的资源。上面的key为vfsImpl的value可以是VFS的具体实现,必须
* 是权限类名,多个使用逗号隔开,如果存在则设置到configuration中的vfsImpl属性中,如果存在多个,则设置到configuration中的仅是最后一个
* */
loadCustomVfs(settings);
//解析别名标签,例<typeAlias alias="user" type="cn.com.bean.User"/>
typeAliasesElement(root.evalNode("typeAliases"));
//解