资讯专栏INFORMATION COLUMN

Mybatis中alices的实现

魏明 / 2084人阅读

摘要:使用方式别名的实现方式有三种指定一个类路径,并指定这个类的别名第二种方式,指定类名和别名指定一个包名,会自动扫描包下可以使用别名的类源码分析的加载过程代码入口的加载方式,首先进入标签后,先判断子节点。

mybatis 别名
1.别名的作用
别名是一个指代的名称,当类的全限定名过长的时候,我们可以用一个简短的名称指代它,这个名称可以再全文指代。
2.使用方式
别名的实现方式有三种
(1).指定一个类路径,并指定这个类的别名


    

(2).第二种方式,指定类名和别名


    

(3).指定一个包名,mybatis会自动扫描包下可以使用别名的类


    

3.源码分析
的加载过程
代码入口:typeAliasesElement(root.evalNode("typeAliases"));

typeAlias的加载方式,首先进入标签后,先判断子节点。
(1).如果子节点是,
调用configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage)方法
(2).如果子节点是,判断type的内容
如果type为null,调用typeAliasRegistry.registerAlias(clazz);
如果type不为null,调用typeAliasRegistry.registerAlias(alias, clazz)

private void typeAliasesElement(XNode parent) {
    if (parent != null) { 
        //获取所有的子节点
      for (XNode child : parent.getChildren()) {
        if ("package".equals(child.getName())) {
          //加载方式
          String typeAliasPackage = child.getStringAttribute("name");
          configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);
        } else {
          // 获取 alias 和 type 属性值,alias可为空
          String alias = child.getStringAttribute("alias");
          String type = child.getStringAttribute("type");
          try {
            // 加载 type 对应的类型
            Class clazz = Resources.classForName(type);
            if (alias == null) {
            //加载方式
              typeAliasRegistry.registerAlias(clazz);
            } else {
            //加载方式
              typeAliasRegistry.registerAlias(alias, clazz);
            }
          } catch (ClassNotFoundException e) {
            throw new BuilderException("Error registering typeAlias for "" + alias + "". Cause: " + e, e);
          }
        }
      }
    }
    }

分析别名的加载,三种情况
首先分析指定类路径,并指定这个类的别名的加载方式。原因是另外两种方法其实最后还是调用了这个方式

//alias != null
//
typeAliasRegistry.registerAlias(alias, clazz);

public void registerAlias(String alias, Class value) {
if (alias == null) throw new TypeException("The parameter alias cannot be null");
//将Alias的值大写转换为小写
String key = alias.toLowerCase(Locale.ENGLISH); // issue #748
//TYPE_ALIASES的定义:  
//private final Map> TYPE_ALIASES = new HashMap>();
//如果TYPE_ALIASES中存在,抛出异常,否则,放入到TYPE_ALIASES中
if (TYPE_ALIASES.containsKey(key) && TYPE_ALIASES.get(key) != null && !TYPE_ALIASES.get(key).equals(value)) {
  throw new TypeException("The alias "" + alias + "" is already mapped to the value "" + TYPE_ALIASES.get(key).getName() + "".");
}
TYPE_ALIASES.put(key, value);

}

//alias == null
//
typeAliasRegistry.registerAlias(clazz);
//处理思路是通过type获取类名,然后调用registerAlias(alias, type)方法

public void registerAlias(Class type) {
//获取全路径类名的简称
String alias = type.getSimpleName();
Alias aliasAnnotation = type.getAnnotation(Alias.class);
if (aliasAnnotation != null) {
  // 从注解中取出别名
  alias = aliasAnnotation.value();
} 
//调用registerAlias方法
registerAlias(alias, type);

}

//
String typeAliasPackage = child.getStringAttribute("name");
configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);

public void registerAliases(String packageName, Class superType){
    
ResolverUtil> resolverUtil = new ResolverUtil>();
//查找此路径下所有的类
resolverUtil.find(new ResolverUtil.IsA(superType), packageName);
//获取查找结果
Set>> typeSet = resolverUtil.getClasses();
for(Class type : typeSet){
  // Ignore inner classes and interfaces (including package-info.java)
  // Skip also inner classes. See issue #6
  // 忽略接口,内部类,匿名类
  if (!type.isAnonymousClass() && !type.isInterface() && !type.isMemberClass()) {
    // 为类型注册别名
    registerAlias(type);
  }
}

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75920.html

相关文章

  • Python之路--python基础2

    摘要:内容列表元组操作字符串操作字典操作集合操作文件操作字符编码与转码内置函数在中,最基本的数据结构是序列。序列中的每个元素被分配一个序号即元素的位置,也称为索引。空字典不包括任何项由两个大括号组成。 day2内容1、列表、元组操作2、字符串操作3、字典操作4、集合操作5、文件操作6、字符编码与转码7、内置函数 在Python中,最基本的数据结构是序列(sequence)。序列中的每个元素被...

    Binguner 评论0 收藏0
  • 比特币交易(一)

    摘要:在比特币白皮书中,有三段话很关键的话,解释了交易是什么。电子货币从所有者转移给下一个人是通过,所有者使用私钥,对交易和下一个人的公钥进行数字签名,并将数字签名附在这枚电子货币数字签名链的后面。 在比特币白皮书中,有三段话很关键的话,解释了交易 Transactions 是什么。 虽然数字签名(Digital signatures)部分解决了电子现金系统的问题,但是仍然需要第三方的支持...

    Blackjun 评论0 收藏0
  • 为项目配置docker

    摘要:和首先,在以往的项目中,都是使用的形式来配置的,所以,首先就需要了解这两者的关系。完整配置文件版本号服务官方参考 之前就了解过docker,但是一直没有自己配置过docker。这次自己为项目配置了一下docker,在这里做一下总结记录。 Dockerfile和docker-compose 首先,在以往的项目中,都是使用DockerFile + docker-compose的形式来配置d...

    qiangdada 评论0 收藏0
  • 如何在NEO区块链上实现信息加密

    摘要:首先,和拥有一对密钥,接着,和互换公钥,与互换公钥互换公钥后便可使用一种称为椭圆曲线密钥交换体制见维基百科的常见技术创建双方的共享密钥。上文仅是的基本介绍,下文将讲解怎样使用为区块链上的信息加密。 你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或...

    darcrand 评论0 收藏0
  • 超赞!快来用Python搭建你AI老婆吧!

    摘要:夏天太热,又不想出门,就让我们用的来搭建属于自己的可以对话的老婆吧本文拟使用的开发语言实现类似于的平台的小娜,或者是下的的。 夏天太热,又不想出门,就让我们用的Python来搭建属于自己的〜可以对话的AI老婆吧〜   本文拟使用Python的开发语言实现类似于的WIndows平台的小娜,或者是IOS下的Siri的。最终达到人机对话的效果。 showImg(https://segment...

    Tychio 评论0 收藏0

发表评论

0条评论

魏明

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<