Mybatis 中的 VFS 是个啥

435 阅读2分钟

先说结论:

正如其名,Virtual File System 虚拟化文件系统。在 Mybatis 中主要最为用户自定义 Java Mapper 类,和 Type Alias 类的加载的入口。名号叫的比较大,但是在 Mybatis 中对该部分的实现相对比较简单且并不完整。甚至用鸡肋来形容都有些过奖了。该代码是 JBoss 提交并合并到了 Mybatis 主干分支。用户可以通过 JbossVFS 功能完成 MyBatis 资源的管理。但是在 SpringBoot 大行其道的今天,应用的发布都是打包成一个 jar 包发布。所以该功能基本没有任何意义。该代码几乎不参与我们日常程序的运行。

代码组成:

  1. VSF 是一个抽象类,mybatis 自带了两个实现类。
  • org.apache.ibatis.io.JBoss6VFS (在 JBoss 环境中会自动启用)
  1. 通过检查 org.jboss.vfs.VFS 和 org.jboss.vfs.VirtualFile 类是否存在来判断
  • org.apache.ibatis.io.DefaultVFS
  1. 主要实现了从 jar 包中扫描类文件或其他资源

怎么会用到这个功能:

先来看看代码流程图

从代码流程图可以看出来。xml 配置中可以使用该特性。来看看 mybatis.org/dtd/mybatis… 是怎么描述这个特性的。

那基本可以看出来使用方法了。

参考文档:

mybatis.org/mybatis-3/z…

mybatis.org/mybatis-3/z…

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>  <environments default="development">    <environment id="development">      <transactionManager type="JDBC"/>      <dataSource type="POOLED">        <property name="driver" value="${driver}"/>        <property name="url" value="${url}"/>        <property name="username" value="${username}"/>        <property name="password" value="${password}"/>      </dataSource>    </environment>  </environments>    <typeAliases>    <typeAlias alias="Author" type="domain.blog.Author"/>    <typeAlias alias="Blog" type="domain.blog.Blog"/>    <typeAlias alias="Comment" type="domain.blog.Comment"/>    <typeAlias alias="Post" type="domain.blog.Post"/>    <typeAlias alias="Section" type="domain.blog.Section"/>    <typeAlias alias="Tag" type="domain.blog.Tag"/>    <!-- 此处会调用 VFS -->    <package name="domain.blog"/>	</typeAliases>    <mappers>    <mapper resource="com/demo/mapper/AuthorMapper.xml"/>  	<mapper resource="com/demo/mapper/BlogMapper.xml"/>  	<mapper resource="com/demo/mapper/PostMapper.xml"/>        <mapper url="file:///var/mappers/AuthorMapper.xml"/>  	<mapper url="file:///var/mappers/BlogMapper.xml"/>  	<mapper url="file:///var/mappers/PostMapper.xml"/>        <mapper class="com.demo.mapper.AuthorMapper"/>    <mapper class="com.demo.mapper.BlogMapper"/>    <mapper class="com.demo.mapper.PostMapper"/>        <!-- 此处会调用 VFS -->    <package name="com.demo.mapper.builder"/>  </mappers></configuration>

那么mybatis-spring项目有没有使用到该特性呢。

答案:没有,mybatis-spring 完全使用了 spring 的 org.springframework.context.annotation.ClassPathBeanDefinitionScanner 类实现了包扫描。没有于 VFS 有任何交互。

怎么自定义 VFS

public class CustomVFS extends VFS {
  public static void main(String[] args) {    Configuration configuration = new Configuration();    configuration.setVfsImpl(CustomVFS.class);  }
  @Override  public boolean isValid() {    // 取决于是否被激活使用    return true;  }
  @Override  protected List<String> list(URL url, String forPath) throws IOException {      return Files.walk(Paths.get(url.toURI()).resolve(forPath)).filter(path -> {        if (Files.isDirectory(path)) {          return false;        }        if (!Files.isRegularFile(path)) {          return true;        }        return path.endsWith("class");      }).collect(Collectors.toList());  }  }

结语:

就是一个 JBoss 提交的一段代码。几乎与我们日常开发没有任何关系。完全没有任何研究意义。