mybatis源码分析 二、Resources以及ClassLoader的使用
- 当我们使用使用mybtis的时候,可以发现我们第一步做的事情就是使用resouce去加载我们的全局配置文件。下面是使用mybatis的一段测试代码。
public static void main(String[] args) throws IOException {
//读取 mybatis-config.xml 文件转成输入流
Reader resourceAsReader = Resources.getResourceAsReader("org/apache/ibatis/dao/mapper/mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader);
SqlSession sqlSession = build.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = mapper.selectById("0954693eb7ebaa0b693d3c787fb8bab7");
System.out.println(map);
}
我们首先使用的就是Resources 类里面的**Resources.getResourceAsReader()**方法读取我们的全局配置文件mybatis-config.xml,接下来我带大家看看Resources 的源码。
public static Properties getResourceAsProperties(String resource) throws IOException {
Properties props = new Properties();
InputStream in = getResourceAsStream(resource);
props.load(in);
in.close();
return props;
}
public static InputStream getResourceAsStream(String resource) throws IOException {
return getResourceAsStream(null, resource);
}
这两个方法是resource的核心方法,可以看到返回值是不同的,一个是将文件的信息读取成流进行返回,另一个是返回的Properties对象。其实转成Properties的那个方法也是先调用了getResourceAsStream先将数据转成流然后再封装成Properties对象。所以执行流程基本一致。
public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);
if (in == null) {
throw new IOException("Could not find resource " + resource);
}
return in;
}
最有都是由 classLoaderWrapper.getResourceAsStream(resource, loader)转成的流。所以其实Resources类最终使用的还是classLoaderWrapper。classLoaderWrapper是mybatis io包中针对classLoader的一个包装器。主要就是对classLoader的使用进行的封装。
可以看到ClassLoaderWrapper内置了两个的Classloader对象。一个是默认加载器(defaultClassLoader)和系统加载器(systemClassLoader)。
calssLoader是类加载器,calssLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确的运行了。mybatis中使用到classLoader的作用主要是用来加载资源。
这个就是他mybatis使用classLoader的核心方法。使用calssLoader的getResourceAsStream方法。主要作用就是根据路径去读取我们文件的信息然后转换成流。
其实Resource类的主要作用就是读取我们配置文件的信息。