sqlSession深入源码 resource

 参考资料:http://www.mybatis.org/mybatis-3/zh/java-api.html#sqlSessions

                                                                                                                                              

 InputStream inputStream = null;  
 inputStream = Resources.getResourceAsStream("mybatis.xml");  
       Resources 工具类,这个类在 org.mybatis.io 包中。Resources 类正如其名,会帮助你从类路径下,文件系统或一个 web URL 加载 资源文件。 我们用它来加载mybatis的全局配置xml文件。   看一下这个类的源代码或者通过你的 IDE 来查看,就会看到一整套有用的方法。这里给出一个简表:

URL getResourceURL(String resource)
URL getResourceURL(ClassLoader loader, String resource)
InputStream getResourceAsStream(String resource)
InputStream getResourceAsStream(ClassLoader loader, String resource)
Properties getResourceAsProperties(String resource)
Properties getResourceAsProperties(ClassLoader loader, String resource)
Reader getResourceAsReader(String resource)
Reader getResourceAsReader(ClassLoader loader, String resource)
File getResourceAsFile(String resource)
File getResourceAsFile(ClassLoader loader, String resource)
InputStream getUrlAsStream(String urlString)
Reader getUrlAsReader(String urlString)
Properties getUrlAsProperties(String urlString)
Class classForName(String className)


    这里Resource.getResourceAsStream("mybatis.xml")的方法源码如下,它返回调用了Resource内部的getResourceAsStream(null, resource)方法。

 

  /*
   * Returns a resource on the classpath as a Stream object
   *
   * @param resource The resource to find
   * @return The resource
   * @throws java.io.IOException If the resource cannot be found or read
   */
  public static InputStream getResourceAsStream(String resource) throws IOException {
    return getResourceAsStream(null, resource);
  }

返回getResourceAsStream(null,resource)源码如下。我看了下Resource中的源码,发现其中的大部分方法都是调用了classLoaderWrapper类,也就是说,Resource不干活,出力的是classLoaderWrapper。而和url有关的方法,Resource调用了URL.class的方法。ClassLoaderWrapper类主要包含了资源加载和访问相关的类。感兴趣的可以自己去看看源码或者看点资料。

  public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
    InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);
    if (in == null) {
      throw new IOException("Could not find resource " + resource);
    }
    return in;
  }

源码中调用了classLoaderWrapper类的getResourceAsStream(resource,loader)方法。
而classLoaderWrapper类的getResourceAsStream(resource,loader)方法又调用了getResourceAsStream(resource, getClassLoaders(classLoader))方法。
ClassLoader是类加载器,用来加载Java类到 Java 虚拟机中的一种加载器,就是它实现了读取文件。

InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {
    for (ClassLoader cl : classLoader) {
      if (null != cl) {

        // try to find the resource as passed
        InputStream returnValue = cl.getResourceAsStream(resource);

        // now, some class loaders want this leading "/", so we'll add it and try again if we didn't find the resource
        if (null == returnValue) {
          returnValue = cl.getResourceAsStream("/" + resource);
        }

        if (null != returnValue) {
          return returnValue;
        }
      }
    }
    return null;
  }





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章