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;
  }





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