5. 解析typeAliases节点
在 MyBatis 中,我们可以为自己写的一些类定义一个别名。这样在使用的时候,只需要输入别名即可,无需再把全限定的类名写出来。在 MyBatis 中,我们有两种方式进行别名配置。
• 第一种是仅配置包名,让 MyBatis 去扫描包中的类型,并根据类型得到相应的别名。这种方式可配合 Alias 注解使用,即通过注解为某个类配置别名,而不是让 MyBatis 按照默认规则生成别名。
• 第二种方式是通过手动的方式,明确为某个类型配置别名。
第一种配置方式
1 | <typeAliases> |
第二种配置方式
1 | <typeAliases> |
第一种自动扫描的方式配置起来比较简单,缺点也不明显。唯一能想到缺点可能就是 MyBatis 会将某个包下所有符合要求的类的别名都解析出来,并形成映射关系。如果你不想让某些类被扫描,这个好像做不到,没发现MyBatis提供了相关的排除机制。这并不是什么大问题,最多是多解析并缓存了一些别名到类型的映射,在时间和空间上产生了一些的消耗而已。
第二种配置方式,通过手工的方式精确配置某些类型的别名。不过这种方式比较繁琐,特别是配置项比较多时。
配置项非常少时,两种皆可。比较多的话,还是让 MyBatis 自行扫描吧。
1 | // -☆- XMLConfigBuilder |
从节点中解析并注册别名
在别名的配置中,type 属性是必须要配置的,而alias属性则不是必须的。这个在配置文件的 DTD 中有所规定。如果使用者未配置 alias 属性,则需要 MyBatis 自行为目标类型
生成别名。
对于别名为空的情况,注册别名的任务交由 registerAlias(Class>) 方法处理。
若不为空,则由 registerAlias(String,Class>) 进行别名注册。
1 | public void registerAlias(Class<?> type) { |
若用户未明确配置 alias 属性,MyBatis 会使用类名的小写形式作为别名。比如,
全限定类名 xyz.coolblog.model.Author 的别名为 author。若类中有@Alias 注解,则从注解中取值作为别名。
从指定的包中解析并注册别名
主要由别名的解析和注册两步组成
1 | public void registerAliases(String packageName) { |
可简单总结为下面两个步骤:
- 一是查找指定包下的所有类
- 二是遍历查找到的类型集合,为每个类型注册别名
注册 MyBatis 内部类及常见类型的别名
下一些 MyBatis 内部类及一些常见类型的别名注册过程
1 | public Configuration() { |
TypeAliasRegisty
1 | public TypeAliasRegistry() { |
以上就是别名解析的全部流程