摘要:使用方式别名的实现方式有三种指定一个类路径,并指定这个类的别名第二种方式,指定类名和别名指定一个包名,会自动扫描包下可以使用别名的类源码分析的加载过程代码入口的加载方式,首先进入标签后,先判断子节点。
mybatis 别名
1.别名的作用
别名是一个指代的名称,当类的全限定名过长的时候,我们可以用一个简短的名称指代它,这个名称可以再全文指代。
2.使用方式
别名的实现方式有三种
(1).指定一个类路径,并指定这个类的别名
(2).第二种方式,指定类名和别名
(3).指定一个包名,mybatis会自动扫描包下可以使用别名的类
3.源码分析
代码入口:typeAliasesElement(root.evalNode("typeAliases"));
typeAlias的加载方式,首先进入
(1).如果子节点是
调用configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage)方法
(2).如果子节点是
如果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
摘要:内容列表元组操作字符串操作字典操作集合操作文件操作字符编码与转码内置函数在中,最基本的数据结构是序列。序列中的每个元素被分配一个序号即元素的位置,也称为索引。空字典不包括任何项由两个大括号组成。 day2内容1、列表、元组操作2、字符串操作3、字典操作4、集合操作5、文件操作6、字符编码与转码7、内置函数 在Python中,最基本的数据结构是序列(sequence)。序列中的每个元素被...
摘要:和首先,在以往的项目中,都是使用的形式来配置的,所以,首先就需要了解这两者的关系。完整配置文件版本号服务官方参考 之前就了解过docker,但是一直没有自己配置过docker。这次自己为项目配置了一下docker,在这里做一下总结记录。 Dockerfile和docker-compose 首先,在以往的项目中,都是使用DockerFile + docker-compose的形式来配置d...
摘要:首先,和拥有一对密钥,接着,和互换公钥,与互换公钥互换公钥后便可使用一种称为椭圆曲线密钥交换体制见维基百科的常见技术创建双方的共享密钥。上文仅是的基本介绍,下文将讲解怎样使用为区块链上的信息加密。 你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或...
摘要:夏天太热,又不想出门,就让我们用的来搭建属于自己的可以对话的老婆吧本文拟使用的开发语言实现类似于的平台的小娜,或者是下的的。 夏天太热,又不想出门,就让我们用的Python来搭建属于自己的〜可以对话的AI老婆吧〜 本文拟使用Python的开发语言实现类似于的WIndows平台的小娜,或者是IOS下的Siri的。最终达到人机对话的效果。 showImg(https://segment...
阅读 2077·2021-11-24 09:39
阅读 1409·2019-08-30 15:44
阅读 1905·2019-08-29 17:06
阅读 3309·2019-08-29 16:32
阅读 3514·2019-08-29 16:26
阅读 2613·2019-08-29 15:35
阅读 2988·2019-08-29 12:50
阅读 1596·2019-08-29 11:15