mybatis源码-别名

  作者:记性不好的阁主

中文文档:https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases


mybatis-config.xml配置


类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
  <typeAlias alias="Comment" type="domain.blog.Comment"/>
  <typeAlias alias="Post" type="domain.blog.Post"/>
  <typeAlias alias="Section" type="domain.blog.Section"/>
  <typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>

当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

<typeAliases>
  <package name="domain.blog"/>
</typeAliases>

每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。见下面的例子:

@Alias("author")
public class Author {
    ...
}



解析配置:


private void parseConfiguration(XNode root) {
try {
// 解析mybatis-config.xml文件中的<properties>元素
propertiesElement(root.evalNode("properties"));
// 解析mybatis-config.xml文件中的<settings>元素
Properties settings = settingsAsProperties(root.evalNode("settings"));
// 加载自定义虚拟文件系统 <settings><vfsImpl></vfsImpl></settings>
loadCustomVfs(settings);
// 加载自定义日志实现 <settings><logImpl></logImpl></settings>
loadCustomLogImpl(settings);
// 解析mybatis-config.xml文件中的<typeAliases>元素
typeAliasesElement(root.evalNode("typeAliases"));

} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}


解析mybatis-config.xml文件中的<typeAliases>元素


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 {
String alias = child.getStringAttribute("alias");
String type = child.getStringAttribute("type");
try {
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);
}
}
}
}
}



  • if ("package".equals(child.getName())) 判断是否配置的是包下搜索
  • 如果是包下搜索那么会去寻找包下带有  @Alias 标签的类


public void registerAlias(Class<?> type) {
String alias = type.getSimpleName();
Alias aliasAnnotation = type.getAnnotation(Alias.class);
if (aliasAnnotation != null) {
alias = aliasAnnotation.value();
}
registerAlias(alias, type);
}


Alias注解:


/**
* Copyright 2009-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ibatis.type;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* The annotation that specify alias name.
*
* <p>
* <b>How to use:</b>
* <pre>
* &#064;Alias("Email")
* public class UserEmail {
* // ...
* }
* </pre>
* @author Clinton Begin
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Alias {
/**
* Return the alias name.
*
* @return the alias name
*/
String value();
}



  • 如果不是package,那么就会去解析mybatis-config.xml中的<typeAliases>标签的属性alias和type


String alias = child.getStringAttribute("alias");

String type = child.getStringAttribute("type");



相关推荐

评论 抢沙发

表情

分类选择