MyBatis的SpringBootVFS解析
mybatis-spring-boot-starter
项目中的一个关键类:SpringBootVFS
。它的主要作用是让 MyBatis 能够在 Spring Boot 的应用环境中(尤其是打包成 JAR 文件后)正确地扫描和加载 Java 类,特别是用于自动注册 MyBatis 的 Mapper 接口。
要理解它,需要先了解背景知识:
背景:MyBatis 的 VFS (Virtual File System)
- MyBatis 本身提供了一个
VFS
(虚拟文件系统) 抽象层。 - 这个
VFS
的主要功能之一是列出指定路径下的所有资源(例如,列出com/example/mapper
包下的所有.class
文件)。 - 这在 MyBatis 中非常关键,因为当配置了
mybatis.type-aliases-package
或mybatis.mapper-locations
时,MyBatis 需要扫描这些包来找到对应的实体类或 Mapper 接口。 - 在传统的 Web 应用(打包成 WAR)中,文件系统是标准的,MyBatis 自带的
VFS
实现通常能正常工作。 - 但在 Spring Boot 应用中,应用被打包成一个 可执行的 JAR 文件,内部的文件结构是嵌套的 JAR (JAR in JAR),标准的
VFS
实现无法正确解析这种结构,导致扫描失败。
SpringBootVFS
的作用
SpringBootVFS
就是为了解决上述问题而存在的。它是一个 MyBatis VFS 的 Spring Boot 适配器。它利用了 Spring 框架强大的资源加载能力(PathMatchingResourcePatternResolver
)来替代 MyBatis 原生的、在 JAR 环境下失效的文件扫描逻辑。
代码逐行解析
package org.mybatis.spring.boot.autoconfigure;
- 包名表明这是 MyBatis-Spring-Boot-Starter 的自动配置包。
import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.URL;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;import org.apache.ib