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

     
  • 相关阅读:
    poj2387Til the Cows Come Home(dijkstra)
    poj2349Arctic Network
    poj1789Truck History
    zoj1586QS Network
    poj2421Constructing Roads
    poj2301Building a Space Station(最小生成树)
    poj1287Networking(最小生成树)
    myeclipse配置svn亲测
    MyEclipse8.6安装svn(非link方式)
    myeclipse一些技巧
  • 原文地址:https://www.cnblogs.com/wuxiaolong4/p/11369429.html
Copyright © 2020-2023  润新知