zoukankan      html  css  js  c++  java
  • 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数组循环一边,直到加载出资源为止。

     
  • 相关阅读:
    14款经典的MySQL客户端软件
    淘宝、百度软件工程师们小调皮,各种霸气外漏
    使用Navicat for Oracle工具连接oracle出错:ORA-12737
    解析xlsx与xls--使用2012poi.jar
    LUOGU P4163 [SCOI2007]排列
    LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
    LUOGU P1438 无聊的数列 (差分+线段树)
    LUOGU P1967 货车运输(最大生成树+树剖+线段树)
    LUOGU P3382 【模板】三分法 (三分)
    LUOGU P4027 [NOI2007]货币兑换 (斜率优化+CDQ分治)
  • 原文地址:https://www.cnblogs.com/wuxiaolong4/p/11369429.html
Copyright © 2011-2022 走看看