Mybatis Alias
- Author: HuiFer
- Description: 该文介绍 mybatis Alias 源码
- 源码阅读工程: SourceHot-Mybatis
- 源码位置 :
org.apache.ibatis.type.Alias - 与 Alias 相关的一个方法
org.apache.ibatis.type.TypeAliasRegistry.registerAlias(java.lang.String, java.lang.Class<?>)(别名注册)
/*** 别名注册,* 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 #748String 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对象
/*** 别名存放仓库* 是一个map key=>别名,value=>字节码*/private final Map<String, Class<?>> typeAliases = new HashMap<>();
不难看出这个对象存放的内容是 别名 -> clazz.
- 相关注解
Alias
@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface Alias {/*** Return the alias name.** @return the alias name*/String value();}
- 看一下实现方式
/*** 加载{@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();}// 转换为 别名,clazzregisterAlias(alias, type);}
最后回到了org.apache.ibatis.type.TypeAliasRegistry.registerAlias(java.lang.String, java.lang.Class<?>)方法
我们可以简单编写一个测试类
@Alias(value = "hc")public class Hc {}/*** 对注解 {@link Alias} 的测试用例*/@Testvoid 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
