搜索
您的当前位置:首页正文

第二章 资源加载 单例模式的VFS

来源:知库网

简书 许乐
转载请注明原创出处,谢谢!

  VFS 表示虚拟文件系统(Virtual File System),它用来在磁盘中查找指定路径下的资源。VFS 是一个抽象类,Mybatis提供了JBoss6VFS和DefaultVFS两个VFS实现。用户也可以提供自定义的VFS实现类,后面介绍Mybatis初始化的流程时,还会提到这两个扩展点。

VFS 及其实现类

VFS的核心字段的含义如下:

  //Mybatis提供的两个VFS实现类
  public static final Class<?>[] IMPLEMENTATIONS 
                              = { JBoss6VFS.class, DefaultVFS.class };
  //用户自定义的VFS的实现类,VFS.addImplClass() 方法会将自定义的VFS的Class对象添加到该集合中
  public static final List<Class<? extends VFS>> USER_IMPLEMENTATIONS 
                                = new ArrayList<>();

VFS的核心方法:

  //单例模式的全局唯一访问点
  public static VFS getInstance(){
    return VFSHolder.INSTANCE;
  }

VFS的静态内部类:

private static class VFSHolder {
  static final VFS INSTANCE = createVFS();
  static VFS createVFS() {
    List<? extends VFS> impls = new ArrayList<Class<? extends VFS>>();
    impls.addAll(USER_IMPLEMENTATIONS);// 添加用户自定义的VFS子类 
    impls.addAll(Arrays.asList((Class<? extends VFS>[]) IMPLEMENTATIONS));
    // 遍历impls集合,依次实例化对象并检测VFS对象是否有效,一旦得到有效的VFS对象,则循环结束。
    //由于是链表的数据结构,会先遍历用户自定义的VFS
    VFS vfs = null;
    for (int i = 0; vfs == null || !vfs.isValid(); i++) {
        Class<? extends VFS> impl = impls.get(i);
        try {
            vfs = impl.newInstance();
            if (vfs == null || !vfs.isValid()) {
              // ...写日志
            }
          } catch (Exception e) {
            // ...写日志
            return null;
          }
     }
    return vfs;
  }
}

关于本节的思考
1.Mybatis怎么实现用户自定义的VFS类并使得其可以优先使用自定义VFS来加载资源?
2.Resource 和VFS 的区别?
实验对比差异性

Top