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

举报
周杰伦本人 发表于 2022/08/29 22:14:58 2022/08/29
【摘要】 聊聊Mybatis的类型转换的别名管理 别名注册 具体注册 总结 聊聊Mybatis的类型转换的别名管理用过mybatis框架的都知道,通过<typeAlias>标签可以使用别名来替代完整的类名,实现这个功能的类在于TypeAliasRegistry可以根据@Alias注解来获取别名,完成别名和类的注册,我们不妨分析它是怎么实现的别名逻辑的对应方法是registerAliases(): 别...

聊聊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的其他模块的源码内容,如果文章有分析不到位的地方,欢迎评论区给我留言指正。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。