【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."); } }
本身还是好理解的吧,就是对字符串的一个解析,大概的解析过程:
- 先根据 . 进行分割,解析出 name 和 children 的值;
- 这时将 name 的值赋值给 indexedName;
- 继续以 [ 进行分割,确定出 index 和 name 的值。
3 示例
4 小结
本节关于PropertyTokenizer的分析就到这里了,有理解不对的地方欢迎指正哈。