# Mybatis Alias - Author: [HuiFer](https://github.com/huifer) - Description: 该文介绍 mybatis Alias 源码 - 源码位置 :`org.apache.ibatis.type.Alias` - 与 Alias 相关的一个方法`org.apache.ibatis.type.TypeAliasRegistry.registerAlias(java.lang.String, java.lang.Class)`(别名注册) ```java /** * 别名注册, * typeAliases 是一个map key=>别名,value=>字节码 * * @param alias 别名名称 * @param value 别名的字节码 */ public void registerAlias(String alias, Class value) { if (alias == null) { throw new TypeException("The parameter alias cannot be null"); } // issue #748 String key = alias.toLowerCase(Locale.ENGLISH); if (typeAliases.containsKey(key) && typeAliases.get(key) != null && !typeAliases.get(key).equals(value)) { throw new TypeException("The alias '" + alias + "' is already mapped to the value '" + typeAliases.get(key).getName() + "'."); } typeAliases.put(key, value); } ``` - registerAlias 操作的对象是一个`map`对象 ```java /** * 别名存放仓库 * 是一个map key=>别名,value=>字节码 */ private final Map> typeAliases = new HashMap<>(); ``` 不难看出这个对象存放的内容是 别名 -> clazz. - 相关注解`Alias` ```java @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Alias { /** * Return the alias name. * * @return the alias name */ String value(); } ``` - 看一下实现方式 ```java /** * 加载{@link Alias} 注解的内容 * * @param type */ public void registerAlias(Class type) { String alias = type.getSimpleName(); Alias aliasAnnotation = type.getAnnotation(Alias.class); if (aliasAnnotation != null) { // 获取 别名注解 alias = aliasAnnotation.value(); } // 转换为 别名,clazz registerAlias(alias, type); } ``` 最后回到了`org.apache.ibatis.type.TypeAliasRegistry.registerAlias(java.lang.String, java.lang.Class)`方法 我们可以简单编写一个测试类 ```java @Alias(value = "hc") public class Hc { } /** * 对注解 {@link Alias} 的测试用例 */ @Test void testAnnotation() { TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry(); typeAliasRegistry.registerAlias(Hc.class); assertEquals("org.apache.ibatis.type.Hc", typeAliasRegistry.resolveAlias("hc").getName()); } ``` 其他与`Alias`相关的测试类位于: `org.apache.ibatis.type.TypeAliasRegistryTest`