mybatis从零阅读资源加载

Posted wuxiaolong4

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis从零阅读资源加载相关的知识,希望对你有一定的参考价值。

Resources(org.apache.ibatis.io.Resources)是mybatis重要的资源class,它可以加载mybatis的配置文件,返回给我们想要的类型(File,URL,Perpoties,Reader)。           ClassLoaderWrapper(org.apache.ibatis.io.ClassLoaderWrapper)是加载文件的任务的执行者,它帮我们屏蔽ClassLoader。

Resources

Resource作为输入源

         Resources最终调用的还是ClassLoaderWrapper的方法,但是ClassLoaderWrapper对外提供的方法有限,只有将路径转换为Stream和将路径转换为URL两个方法,但是这不能真正满足需求,所以Resources在外层补充了很多方法如返回Properties,返回Reader,返回File等。

             1.getResourceURL                      调用ClassLoaderWrapper.getResourceAsURL
             2.getResourceAsStream             调用ClassLoaderWrapper.getResourceAsStream
             3.getResourceAsProperties        调用ClassLoaderWrapper.getResourceAsStream    new Properties().load(inputStream);
             4.getResourceAsReader            调用ClassLoaderWrapper.getResourceAsStream    new InputStreamReader(inputStream);
             5.getResourceAsFile                  调用ClassLoaderWrapper.getResourceAsURL         new File(URL);

     (getResourceAsFile为什么不调用ClassLoaderWrapper.getResourceAsStream呢,因为Stream没有getFile方法。哈哈哈,玩笑。Stream是封装了流的类,它的输入源可能不止是文件也有可能是网络端口,所以没有getfile方法。Stream类要抽象出所有流的特点,文件只是它的一种情况,而且还是可有可无的,所以没有啊。个人见解)

        以上方法是所有本地路径下所有可以调用的方法,均有两个重载:有classloader和无classloader。

 

URL作为输入源

1.getUrlAsStream                      调用new URL("").openConnection().getInputStream();
2.getUrlAsReader                      调用new URL("").openConnection().getInputStream();      new InputStreamReader(inputStream)
3.getUrlAsProperties                 调用new URL("").openConnection().getInputStream();       new Properties().load(inputStream);

URL作为输入源只有一种情况:输入为路径,输出为Stream,也不可以指定classloader。

classForName

1.其实就是Class.forName只是制定了classloader

设置Charset和修改Charset

1.getCharset

2.setCharset

get set方法不做详细介绍了。他的作用是InputStream转换为InputStreamReader的是可以执行字符集(编码),按照制定的字符集进行转换。

就是字节和字符转换的时候,举个栗子(一般情况字节转字符是两个转换成一个,有的字符集就是三个转换成一个,如果不设置编码就是经常看到的乱码)

外国的文字一般一个字符就可以存储完(就是枚举,0代表博,1代表客,2代表园)情况比较少。但是其他国家比如中国的文字一个根本就存不完,字数太多了。

 

ClassLoaderWrapper

 ClassLoaderWrapper是读取文件资源的最终执行者,它有以下方法:

classloader数组:

classLoader                                                                  执行方法传递进来的
defaultClassLoader,                                                     方法中没有初始化,可能他类帮他初始化了吧(可能性不大)
Thread.currentThread().getContextClassLoader(),     当前线程类的
getClass().getClassLoader(),                                       当前类的  
systemClassLoader                                                     系统默认的

getResourceAsURL

循环classloader的数组去加载Resource,直到返回的URL非空

getResourceAsStream

循环classloader的数组去加载Resource,直到返回的Stream非空

classForName

循环classloader的数组去加载class,直到返回的Stream非空

 

 

总结一下两个类:

Resources提供的方法 方法实质 封装过程
getResourceURL ClassLoaderWrapper.getResourceAsURL 未封装
getResourceAsStream ClassLoaderWrapper.getResourceAsStream 未封装
getResourceAsProperties ClassLoaderWrapper.getResourceAsStream new Properties().load(inputStream);
getResourceAsReader ClassLoaderWrapper.getResourceAsStream new InputStreamReader(inputStream);
getResourceAsFile ClassLoaderWrapper.getResourceAsURL new File(URL);
getUrlAsStream new URL("").openConnection().getInputStream() 未封装
getUrlAsReader new URL("").openConnection().getInputStream(); new InputStreamReader(inputStream)
getUrlAsProperties new URL("").openConnection().getInputStream(); new Properties().load(inputStream);
classForName ClassLoaderWrapper.classForName 未封装

ClassLoaderWrapper加载类的是会将自己的classloader数组循环一边,直到加载出资源为止。

 

以上是关于mybatis从零阅读资源加载的主要内容,如果未能解决你的问题,请参考以下文章

从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)

从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)

Mybatis 源码学习(12)-资源加载

Mybatis 源码学习(12)-资源加载

mybatis原理+ClassLoader加载项目资源

【从0开始学Laya】7-如何使用图集和加载资源