VFS 含义是虚拟文件系统; 主要是通过程序能够方便读取本地文件系统 FTP 文件系统等系统中的文件资源
Mybatis 中提供了 VFS 这个配置, 主要是通过该配置可以加载自定义的虚拟文件系统应用程序
一. 配置应用
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="vfs" ref="vfs"/>
- </bean>
- <bean id="vfs" class="com.zzy.vfs.VFSmybatisTest">
- <!-- 自定义虚拟文件系统应用程序不做说明, 后期单独介绍 -->
- </bean>
二. 源码分析
1.vfs 在源码中加载过程
- if (this.vfs != null) {
- configuration.setVfsImpl(this.vfs);
- }
setVfsImpl(this.vfs) 加载自定义的 vfs
2.setVfsImpl(this.vfs) 方法源码
- public void setVfsImpl(Class<? extends VFS> vfsImpl) {
- if (vfsImpl != null) {
- this.vfsImpl = vfsImpl;
- VFS.addImplClass(this.vfsImpl);
- }
- }
其中 vfsImpl 是 vfs 的实现
3.VFS 相关 class 所在的包
4.VFS 源码
public abstract class VFS {
源码可自己查看, 这里简单介绍下 VFS 其中的源码内容
}
VFS 中有 piblic method 和 protected method
piblic method:
A. 把自定义的类添加到 VFS 实现 list 中
- public static void addImplClass(Class<? extends VFS> clazz) {
- if (clazz != null) {
- USER_IMPLEMENTATIONS.add(clazz);
- }
- }
B. 获得 VFS 的单例
- 2.public static VFS getInstance() {
- }
C.VFS 的实现在当前环境下有效时返回 true
public abstract boolean isValid();
D. 递归列出所有的资源
- public List<String> list(String path) throws IOException {
- List<String> names = new ArrayList<String>();
- for (URL url : getResources(path)) {
- names.addAll(list(url, path));
- }
- return names;
- }
- protected method:
A. 根据类名获取 class
protected static Class<?> getClass(String className)
B. 获取类中的方法
protected static Method getMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes)
C. 执行对象的方法
protected static <T> T invoke(Method method, Object object, Object... parameters)
D. 获取资源 list
protected static List<URL> getResources(String path) throws IOException
E. 递归列出所有资源
protected abstract List<String> list(URL url, String forPath) throws IOException;
类中定义了一个常量数组
public static final Class<?>[] IMPLEMENTATIONS = { JBoss6VFS.class, DefaultVFS.class };
IMPLEMENTATIONS 该数组中有两个 VFS :JBoss6VFS 和 DefaultVFS
5.JBoss6VFS:JBoss6 提供的 vfs api
public class JBoss6VFS extends VFS
源码太长, 大家自己查看, 这里介绍下 JBoss6VFS 中提供的相关 api
A. 构造器: VFS()
B.Public 中的 isValid 和 list 是对父类的 Override
C.Protected 方法
synchronized void initialize()
查找访问 JBoss 6 VFS 需要的所有 class 和 method, 其他方法比较简单, 不做详细介绍
6.DefaultVFS api: 默认实现
可以读取大部分服务的系统文件资源, 大部分情况使用 DefaultVFS 足够
A.Public 中的 isValid 和 list 是对父类的 Override
B.Protected 的方法
listResources(JarInputStream jar, String path)
列出所有的 JarInputStream
findJarForResource(URL url)
通过给定 url 找到 jar 文件中包含的资源
getPackagePath(String packageName)
Java 包名转换成 path
- isJar(URL url)
- isJar(URL url, byte[] buffer)
是否是一个 JAR file
来源: http://mp.weixin.qq.com/s/U68gVROUoZF8ZMJCieRwUA