mybatis从零阅读(二)资源加载
Resources(org.apache.ibatis.io.Resources)是mybatis重要的资源class,
它可以加载mybatis的配置文件,返回给我们想要的类型(File,URL,Perpoties,Reader)。
ClassLoaderWrapper(org.apache.ibatis.io.ClassLoaderWrapper)是加载文件的任务的执行者,它帮我们屏蔽ClassLoader。
一:Resources
1. Resource作为输入源
- Resources最终调用的还是ClassLoaderWrapper的方法,但是ClassLoaderWrapper对外提供的方法有限,只有将路径转换为Stream和将路径转换为URL两个方法,但是这不能真正满足需求,所以Resources在外层补充了很多方法如返回Properties,返回Reader,返回File等。
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);
- (getResourceAsFile为什么不调用ClassLoaderWrapper.getResourceAsStream呢,因为Stream没有getFile方法。哈哈哈,玩笑。Stream是封装了流的类,它的输入源可能不止是文件也有可能是网络端口,所以没有getfile方法。Stream类要抽象出所有流的特点,文件只是它的一种情况,而且还是可有可无的,所以没有啊。个人见解)
以上方法是所有本地路径下所有可以调用的方法,均有两个重载:有classloader和无classloader。
2. URL作为输入源
getUrlAsStream //调用new URL("").openConnection().getInputStream();
getUrlAsReader //调用new URL("").openConnection().getInputStream(); // new InputStreamReader(inputStream)
getUrlAsProperties //调用new URL("").openConnection().getInputStream();// new Properties().load(inputStream);
- URL作为输入源只有一种情况:输入为路径,输出为Stream,也不可以指定classloader。
3. classForName
- 其实就是Class.forName只是制定了classloader
4. 设置Charset和修改Charset
-
getCharset
-
setCharset
-
get set方法不做详细介绍了。他的作用是InputStream转换为InputStreamReader的是可以执行字符集(编码),按照制定的字符集进行转换。
-
就是字节和字符转换的时候,举个栗子(一般情况字节转字符是两个转换成一个,有的字符集就是三个转换成一个,如果不设置编码就是经常看到的乱码)
-
外国的文字一般一个字符就可以存储完(就是枚举,0代表博,1代表客,2代表园)情况比较少。但是其他国家比如中国的文字一个根本就存不完,字数太多了。
二:ClassLoaderWrapper
- ClassLoaderWrapper是读取文件资源的最终执行者,它有以下方法:
1. classloader数组:
classLoader //执行方法传递进来的
defaultClassLoader, //方法中没有初始化,可能他类帮他初始化了吧(可能性不大)
Thread.currentThread().getContextClassLoader() //当前线程类的
getClass().getClassLoader() //当前类的
systemClassLoader //系统默认的
2. getResourceAsURL
- 循环classloader的数组去加载Resource,直到返回的URL非空
3. getResourceAsStream
- 循环classloader的数组去加载Resource,直到返回的Stream非空
4. 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数组循环一边,直到加载出资源为止。
搬砖多年终不得要领,遂载源码看之望得真经。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?