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数组循环一边,直到加载出资源为止。

原文地址:https://www.cnblogs.com/wuxiaolong4/p/11369429.html

时间: 2024-08-29 19:54:28

mybatis从零阅读(二)资源加载的相关文章

spring源码阅读(二) Bean加载之自定义标签加载

紧接着上一篇关于spring默认标签加载,这一篇来看下自定义标签的加载 继续从 DefaultBeanDefinitionDocumentReader来看 protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(root)) { NodeList nl = root.getChildNodes(); for(

Android apk动态加载机制的研究(二):资源加载和activity生命周期管理

出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了更好地阅读本文,你需要先阅读Android apk动态加载机制的研究这篇文章,在此文中,博主分析了Android中apk的动态加载机制,并在文章的最后指出需要解决的两个复杂问题:资源的访问和activity生命周期的管理,而本文将会分析这两个复杂问题的解决方法.需要说明的一点是,我们不可能调起任何一个未安装的

MyBatis 源码篇-资源加载

本章主要描述 MyBatis 资源加载模块中的 ClassLoaderWrapper 类和 Java 加载配置文件的三种方式. ClassLoaderWrapper 上一章的案例,使用 org.apache.ibatis.io.Resources#getResourceAsStream(java.lang.String) 方法加载 MyBatis 的配置文件.Resources 是一个提供了多个静态方法的工具类,内部封装了 ClassLoaderWrapper 类的静态字段,Resources 

插件化框架解读之Android 资源加载机制详解(二)

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680Android提供了一种非常灵活的资源系统,可以根据不同的条件提供可替代资源.因此,系统基于很少的改造就能支持新特性,比如Android N中的分屏模式.这也是Android强大部分之一.本文主要讲述Android资源系统的实现原理,以及在应用开发中需要注意的事项. 一.定义资源 Android使用XML文件描述各种资源,包括字符串.颜色.尺寸.主题.布局.甚至是

Android插件化探索(二)资源加载

前情提要 在探索资源加载方式之前,我们先来看看上一篇中没细讲的东西.还没看过的建议先看上一篇Android插件化探索(一)类加载器DexClassLoader. PathClassLoader和DexClassLoader的区别 DexClassLoader的源码如下: public class DexClassLoader extends BaseDexClassLoader { //支持从任何地方的apk/jar/dex中读取 public DexClassLoader(String dex

cocos creator基础-(二十四)cc.Director与资源加载策略

1: 了解creator场景切换; 2: 了解director基本的一些接口; 3: 理解资源加载的策略; cc.Director对象 1:游戏里面控制管理整个游戏全局对象,包括了场景切换等,为cc.Director对象; 2:导演对象全局只有一个cc.director,大写的为类, 小写的cc.director为全局的导演对象; 3: cc.director来获取导演对象实例; 4: 游戏中各种管理对象都可以通过cc.director获取,比如物理引擎管理,Action管理, 碰撞检测管理等;

也许是被误解的浏览器资源加载优化

几乎每一个前端程序员都知道应该把script标签放在页面底部.关于这个经典的论述可以追溯到Nicholas的 High Performance Javasript 这本书的第一章Loading and Execution中,他之所以建议这么做是因为: Put all <script> tags at the bottom of the page, just inside of the closing </body> tag. This ensures that the page c

【让我们再聊聊浏览器资源加载优化】

几乎每一个前端程序员都知道应该把script标签放在页面底部.关于这个经典的论述可以追溯到Nicholas的 High Performance Javasript 这本书的第一章Loading and Execution中,他之所以建议这么做是因为: Put all <script> tags at the bottom of the page, just inside of the closing </body> tag. This ensures that the page c

[转]让我们再聊聊浏览器资源加载优化

作者 李光毅 发布于 2014年6月27日 几乎每一个前端程序员都知道应该把script标签放在页面底部.关于这个经典的论述可以追溯到Nicholas的 High Performance Javasript 这本书的第一章Loading and Execution中,他之所以建议这么做是因为: Put all <script> tags at the bottom of the page, just inside of the closing </body> tag. This e

Webkit资源加载介绍

一.webkit资源分类 webkit中有多种资源,大致分为以下几种: HTML文本 CSS样式文本 - CachedCSSStyleSheet 字体 - CachedFont 图片 - CachedImage 只读资源 - CachedRawResource JavaScript文本 - CachedScript SVG - CachedSVGDocument 视频字幕 - CachedTextTrack XSL样式表 - CachedXSLStyleSheet 类图如下: HTML文本是网页