【Mybatis】【基础设施】【一】Mybatis源码解析-属性分词器PropertyTokenizer

1  前言

上一节我们在解析settings的时候,说到了分词器PropertyTokenizer,这种东西我理解为框架背后默默付出的辛勤工作者。Mybatis本身可以看作一个舞台,我们可能会看到舞台的表演者比如Mapper、比如SqlSessionFactory等,那么PropertyTokenizer这些东西就像是舞台后的工作者,他们不出面但是他们帮Mybatis管理着后台的每一小部分。那么我们本节就讲一下PropertyTokenizer。

2  源码分析

PropertyTokenizer类定义通读:

/**
 * @author Clinton Begin
 * 分词的符号就是 .
 */
public class PropertyTokenizer implements Iterator<PropertyTokenizer> {
  /**
   * 当前属性的第一块名字
   * 比如jdbc.name 那么name就是jdbc
   * 但是如果属性就是name没有儿子 那么name就是name
   *
   * 还有比如 fullname 是 arr[1]
   * 那么 name 就是 arr
   */
  private String name;
  /**
   * 假如 fullname 没有 [
   * 那么 indexedName 就等于 name
   * 但是有的话
   * 比如 fullname 是 arr[1]
   * indexedName 就等于 arr[1]
   * 而name 是等于 arr
   */
  private final String indexedName;
  /**
   * 这个就是 比如 fullname 是 arr[1] 的话 index = 1
   */
  private String index;
  /**
   * children 就是儿子  可能为空
   * 比如 jdbc.name 那么 children 就是 name
   * 没儿子的话 children 就是 null
   */
  private final String children;

  // 属性分词器
  public PropertyTokenizer(String fullname) {
    int delim = fullname.indexOf('.');
    // 根据 点 进行分割
    if (delim > -1) {
      /**
       * 比如jdbc.username
       * name = jdbc
       * children = username
        */
      name = fullname.substring(0, delim);
      children = fullname.substring(delim + 1);
    } else {
      name = fullname;
      children = null;
    }
    indexedName = name;
    /**
     * 这个是对包含[的属性名字 再次以 [ 进行解析
     * 解析 解析出index
     * 比如 arr[0]
     * index = 0
     * name = arr
     */
    delim = name.indexOf('[');
    if (delim > -1) {
      index = name.substring(delim + 1, name.length() - 1);
      name = name.substring(0, delim);
    }
  }

  public String getName() {
    return name;
  }

  public String getIndex() {
    return index;
  }

  public String getIndexedName() {
    return indexedName;
  }

  public String getChildren() {
    return children;
  }

  @Override
  public boolean hasNext() {
    // 当 children 不为空,就表示当前属性还有儿子
    return children != null;
  }

  @Override
  public PropertyTokenizer next() {
    // 类似进行递归解析
    return new PropertyTokenizer(children);
  }

  @Override
  public void remove() {
    throw new UnsupportedOperationException("Remove is not supported, as it has no meaning in the context of properties.");
  }
}

本身还是好理解的吧,就是对字符串的一个解析,大概的解析过程:

  1. 先根据 . 进行分割,解析出 name 和 children 的值;
  2. 这时将 name 的值赋值给 indexedName;
  3. 继续以 [ 进行分割,确定出 index 和 name 的值。

3  示例

4  小结

本节关于PropertyTokenizer的分析就到这里了,有理解不对的地方欢迎指正哈。

posted @ 2023-02-25 19:59  酷酷-  阅读(111)  评论(0编辑  收藏  举报