美文网首页深入剖析Mybatis实现的细节设计模式
第二章 资源加载 单例模式的VFS

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

作者: Xcdf | 来源:发表于2019-01-15 21:28 被阅读2次

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

      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 的区别?
    实验对比差异性

    相关文章

      网友评论

        本文标题:第二章 资源加载 单例模式的VFS

        本文链接:https://www.haomeiwen.com/subject/dvjudqtx.html