Heim > Java > javaLernprogramm > Eine ausführliche Erklärung der Mybatis-Reihe (4) – detaillierte Konfiguration von TypeAliases-Aliasen (Mybatis-Quellcode)

Eine ausführliche Erklärung der Mybatis-Reihe (4) – detaillierte Konfiguration von TypeAliases-Aliasen (Mybatis-Quellcode)

黄舟
Freigeben: 2017-03-02 10:44:17
Original
2949 Leute haben es durchsucht

Im vorherigen Artikel „Ausführliche Einführung in die Mybatis-Serie (3) --- Detaillierte Konfiguration von Eigenschaften und Umgebungen (Mybatis-Quellcode)“ wurden Eigenschaften und Umgebungen vorgestellt. In diesem Artikel geht es weiterhin um einen der verbleibenden Konfigurationsknoten: typeAliases. Der TypeAliases-Knoten wird hauptsächlich zum Festlegen von Aliasen verwendet. Durch die Konfiguration von Aliasen müssen wir nicht mehr den vollständigen Paketnamen angeben und können auch Aliase verwenden.

Beispiel: Wenn wir com.demo.entity.UserEntity verwenden, können wir einen Alias-Benutzer direkt konfigurieren, sodass wir, wenn wir in Zukunft com.demo.entity.UserEntity in der Konfigurationsdatei verwenden möchten, Wir können es direkt verwenden, nur Benutzer.

Nehmen wir das obige Beispiel als Beispiel, implementieren wir es und sehen, wie typeAliases konfiguriert ist:

<configuration>
    <typeAliases>
      <!--
      通过package, 可以直接指定package的名字, mybatis会自动扫描你指定包下面的javabean,
      并且默认设置一个别名,默认的名字为: javabean 的首字母小写的非限定类名来作为它的别名。
      也可在javabean 加上注解@Alias 来自定义别名, 例如: @Alias(user) 
      <package name="com.dy.entity"/>       -->
      <typeAlias alias="UserEntity" type="com.dy.entity.User"/>
  </typeAliases>
  
  ......  
</configuration>
Nach dem Login kopieren

Schreiben Sie einen weiteren Testcode, um zu sehen, ob es funktioniert: (Ich werde nur einen Absatz schreiben Pseudocode)

Configuration con = sqlSessionFactory.getConfiguration();
Map<String, Class<?>> typeMap = con.getTypeAliasRegistry().getTypeAliases();
for(Entry<String, Class<?>> entry: typeMap.entrySet()) {
    System.out.println(entry.getKey() + " ================> " + entry.getValue().getSimpleName());
}
Nach dem Login kopieren

===================================== = =Ich bin die Trennlinie des Quellcodes======================================= ===== ==

Das Obige stellt kurz die Verwendung von typeAliases vor. Schauen wir uns als Nächstes den Quellcode in Mybatis an:

Alte Regeln, beginnen wir mit der Analyse xml:

 1 /** 
 2  * 解析typeAliases节点 
 3  */ 
 4 private void typeAliasesElement(XNode parent) {
 5     if (parent != null) { 
 6       for (XNode child : parent.getChildren()) { 
 7         //如果子节点是package, 那么就获取package节点的name属性, mybatis会扫描指定的package 
 8         if ("package".equals(child.getName())) { 
 9           String typeAliasPackage = child.getStringAttribute("name");
 10           //TypeAliasRegistry 负责管理别名, 这儿就是通过TypeAliasRegistry 进行别名注册, 下面就会看看TypeAliasRegistry源码
 11           configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);
 12         } else {
 13           //如果子节点是typeAlias节点,那么就获取alias属性和type的属性值
 14           String alias = child.getStringAttribute("alias");
 15           String type = child.getStringAttribute("type");
 16           try {
 17             Class<?> clazz = Resources.classForName(type);
 18             if (alias == null) {
 19               typeAliasRegistry.registerAlias(clazz);
 20             } else {
 21               typeAliasRegistry.registerAlias(alias, clazz);
 22             }
 23           } catch (ClassNotFoundException e) {
 24             throw new BuilderException("Error registering typeAlias for '" + alias + "'. Cause: " + e, e);
 25           }
 26         }
 27       }
 28     }
 29   }
Nach dem Login kopieren


Der wichtige Quellcode ist hier:

TypeAliasRegistry:

public class TypeAliasRegistry {  
  //这就是核心所在啊, 原来别名就仅仅通过一个HashMap来实现, key为别名, value就是别名对应的类型(class对象)
  private final Map<String, Class<?>> TYPE_ALIASES = new HashMap<String, Class<?>>();  /**
   * 以下就是mybatis默认为我们注册的别名   */
  public TypeAliasRegistry() {
    registerAlias("string", String.class);
    registerAlias("byte", Byte.class);
    registerAlias("long", Long.class);
    registerAlias("short", Short.class);
    registerAlias("int", Integer.class);
    registerAlias("integer", Integer.class);
    registerAlias("double", Double.class);
    registerAlias("float", Float.class);
    registerAlias("boolean", Boolean.class);
    registerAlias("byte[]", Byte[].class);
    registerAlias("long[]", Long[].class);
    registerAlias("short[]", Short[].class);
    registerAlias("int[]", Integer[].class);
    registerAlias("integer[]", Integer[].class);
    registerAlias("double[]", Double[].class);
    registerAlias("float[]", Float[].class);
    registerAlias("boolean[]", Boolean[].class);
    registerAlias("_byte", byte.class);
    registerAlias("_long", long.class);
    registerAlias("_short", short.class);
    registerAlias("_int", int.class);
    registerAlias("_integer", int.class);
    registerAlias("_double", double.class);
    registerAlias("_float", float.class);
    registerAlias("_boolean", boolean.class);
    registerAlias("_byte[]", byte[].class);
    registerAlias("_long[]", long[].class);
    registerAlias("_short[]", short[].class);
    registerAlias("_int[]", int[].class);
    registerAlias("_integer[]", int[].class);
    registerAlias("_double[]", double[].class);
    registerAlias("_float[]", float[].class);
    registerAlias("_boolean[]", boolean[].class);
    registerAlias("date", Date.class);
    registerAlias("decimal", BigDecimal.class);
    registerAlias("bigdecimal", BigDecimal.class);
    registerAlias("biginteger", BigInteger.class);
    registerAlias("object", Object.class);
    registerAlias("date[]", Date[].class);
    registerAlias("decimal[]", BigDecimal[].class);
    registerAlias("bigdecimal[]", BigDecimal[].class);
    registerAlias("biginteger[]", BigInteger[].class);
    registerAlias("object[]", Object[].class);
    registerAlias("map", Map.class);
    registerAlias("hashmap", HashMap.class);
    registerAlias("list", List.class);
    registerAlias("arraylist", ArrayList.class);
    registerAlias("collection", Collection.class);
    registerAlias("iterator", Iterator.class);
    registerAlias("ResultSet", ResultSet.class);
  }  
  /**
   * 处理别名, 直接从保存有别名的hashMap中取出即可   */
  @SuppressWarnings("unchecked")  public <T> Class<T> resolveAlias(String string) {    
  try {      
  if (string == null) return null;
      String key = string.toLowerCase(Locale.ENGLISH); // issue #748
      Class<T> value;      if (TYPE_ALIASES.containsKey(key)) {
        value = (Class<T>) TYPE_ALIASES.get(key);
      } else {
        value = (Class<T>) Resources.classForName(string);
      }      return value;
    } catch (ClassNotFoundException e) {      
    throw new TypeException("Could not resolve type alias &#39;" + string + "&#39;.  Cause: " + e, e);
    }
  }  
  /**
   * 配置文件中配置为package的时候, 会调用此方法,根据配置的报名去扫描javabean ,然后自动注册别名
   * 默认会使用 Bean 的首字母小写的非限定类名来作为它的别名
   * 也可在javabean 加上注解@Alias 来自定义别名, 例如: @Alias(user)   */
  public void registerAliases(String packageName){
    registerAliases(packageName, Object.class);
  }  public void registerAliases(String packageName, Class<?> superType){
    ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>();
    resolverUtil.find(new ResolverUtil.IsA(superType), packageName);
    Set<Class<? extends Class<?>>> 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);
      }
    }
  }  public void registerAlias(Class<?> type) {
    String alias = type.getSimpleName();
    Alias aliasAnnotation = type.getAnnotation(Alias.class);    
    if (aliasAnnotation != null) {
      alias = aliasAnnotation.value();
    } 
    registerAlias(alias, type);
  }  //这就是注册别名的本质方法, 其实就是向保存别名的hashMap新增值而已, 呵呵, 别名的实现太简单了,对吧
  public void registerAlias(String alias, Class<?> value) {    
  if (alias == null) throw new TypeException("The parameter alias cannot be null");
    String key = alias.toLowerCase(Locale.ENGLISH); // issue #748
    if (TYPE_ALIASES.containsKey(key) && TYPE_ALIASES.get(key) != null && !TYPE_ALIASES.get(key).equals(value)) {      
    throw new TypeException("The alias &#39;" + alias + "&#39; is already mapped to the value &#39;" + TYPE_ALIASES.get(key).getName() + "&#39;.");
    }
    TYPE_ALIASES.put(key, value);
  }  public void registerAlias(String alias, String value) {    try {
      registerAlias(alias, Resources.classForName(value));
    } catch (ClassNotFoundException e) {      
    throw new TypeException("Error registering type alias "+alias+" for "+value+". Cause: " + e, e);
    }
  }  
  /**
   * 获取保存别名的HashMap, Configuration对象持有对TypeAliasRegistry的引用,因此,如果需要,我们可以通过Configuration对象获取   */
  public Map<String, Class<?>> getTypeAliases() {    
  return Collections.unmodifiableMap(TYPE_ALIASES);
  }
}
Nach dem Login kopieren

Wie es sein kann Aus dem Quellcode geht hervor, dass das Prinzip des Festlegens von Aliasen so einfach ist. Mybatis hat standardmäßig viele Aliase für uns eingerichtet, was im obigen Code zu sehen ist.

Okay, der Inhalt dieses Artikels ist so einfach, das ist alles. Im nächsten Artikel werden weiterhin die Konfigurationsknoten erläutert, die noch nicht fertiggestellt sind.

Das Obige ist eine ausführliche Einführung in die Mybatis-Reihe (4) – detaillierte Konfiguration von TypeAliases-Aliasen (Mybatis-Quellcode). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www .php.cn)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage