写点什么

聊聊 Mybatis 的类型转换的别名管理

作者:周杰伦本人
  • 2022-11-25
    山东
  • 本文字数:1353 字

    阅读完需:约 4 分钟

聊聊 Mybatis 的类型转换的别名管理

用过 mybatis 框架的都知道,通过<typeAlias>标签可以使用别名来替代完整的类名,实现这个功能的类在于 TypeAliasRegistry


可以根据 @Alias 注解来获取别名,完成别名和类的注册,我们不妨分析它是怎么实现的


别名逻辑的对应方法是 registerAliases():

别名注册

TypeAliasRegistry 的 registerAliases()方法:


public void registerAliases(String packageName, Class<?> superType) {     ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<>();     resolverUtil.find(new ResolverUtil.IsA(superType), packageName);     Set<Class<? extends Class<?>>> typeSet = resolverUtil.getClasses();     for (Class<?> type : typeSet) {         if (!type.isAnonymousClass() && !type.isInterface() && !type.isMemberClass()) {             registerAlias(type);         }     } } public void registerAlias(Class<?> type) {     String alias = type.getSimpleName();     // 获取类中的@Alias注解,从中获取别名     Alias aliasAnnotation = type.getAnnotation(Alias.class);     if (aliasAnnotation != null) {         alias = aliasAnnotation.value();     }     // 这里的@Alias注解指定的别名与type类型绑定     registerAlias(alias, type); }
复制代码


  1. 查找指定包下所有的 superType 类型

  2. 不是内部类、接口以及抽象类的话调用 registerAlias()方法,这个方法里获取类的名称,然后获取类中 @Alias 注解的 value 值,然后调用 registerAlias(alias, type);来进行注册。

具体注册

具体注册方法是 registerAlias()方法,我们看一下它的实现逻辑是怎么样的:


public void registerAlias(String alias, Class<?> value) {        if (alias == null) { // 传入的别名为null,直接返回false            throw new TypeException("The parameter alias cannot be null");        }        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);    }
复制代码


判断是否为空,如果为空就抛出异常,不为空的话,首先会将别名全部转为小写,然后把别名和类的映射关系保存到 typeAliases 集合中,TypeAliasRegistry 的构造方法全部调用这个方法进行注册

总结

这就是 Mybatis 的类型转换的别名功能的实现,主要的类就是 TypeAliasRegistry 类,涉及的方法主要是 registerAlias()方法,别名可以指定别名和对应的类来进行注册,也可以通过包扫描所有的类来进行注册,所谓注册就是放到了一个 map 中: Map<String, Class<?>> typeAliases = new HashMap<>();,大体内容就是这些,TypeAliasRegistry 类中的 registerAlias()有很多重载的实现,我们在阅读源码的时候需要注意一下,理顺方法和功能,这样才不会看到源码就头疼。今天的 mybatis 的类型转换模块的源码就分析到这里了,下篇文章我们会讲述 mybatis 的其他模块的源码内容,如果文章有分析不到位的地方,欢迎评论区给我留言指正。

发布于: 刚刚阅读数: 5
用户头像

还未添加个人签名 2020-02-29 加入

公众号《周结论本人》,多平台优质博主

评论

发布
暂无评论
聊聊Mybatis的类型转换的别名管理_11月月更_周杰伦本人_InfoQ写作社区