简书 许乐
转载请注明原创出处,谢谢!
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 的区别?
实验对比差异性
网友评论