日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Mabatis 源码探究(2)Java 获取mybatis-config.xml的输入流 inputStream对象

發布時間:2025/3/19 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mabatis 源码探究(2)Java 获取mybatis-config.xml的输入流 inputStream对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于Mybatis源碼探究的專欄。

其我的專業是軟件技術這個方向的,mybatis 許久以前就學了,但是心里一直存在一些疑惑。也上網查了,看過各種大佬的博客,對

于Mybatis的理解始終感覺不足。最后還是決定要來肝它。

文字功底一般,請諒解。

若有不足,還望能夠指正。

喜歡一句話:
“八小時以內謀生存,八小時以外謀發展”。

---- 趁著還沒有畢業,再看看學校的夜晚,學校的風景。

Java 獲取mybatis-config.xml的輸入流

    • 獲得加載核心配置文件的inputStream流
        • 1)Resources.getResourceAsStream(String resource) 方法
        • 2)getResourceAsStream(null, resource); 方法
        • 3) classLoaderWrapper.getResourceAsStream(resource, loader);
        • 4)getResourceAsStream(resource, getClassLoaders(classLoader));
        • 5)cl.getResourceAsStream(resource);
  • 牽扯到的小知識點:
    • 自言自語

獲得加載核心配置文件的inputStream流

1)Resources.getResourceAsStream(String resource) 方法

這是我們都寫過的一段代碼,大家都知道,里面就是一個千層餅哈。

String resource="mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource);

null 傳的是空的類加載器,這里傳過去空,但是在后面能夠獲得一些其他的類加載器。

public static InputStream getResourceAsStream(String resource) throws IOException {return getResourceAsStream(null, resource); }

2)getResourceAsStream(null, resource); 方法

將類路徑上的資源作為 輸入流對象 返回

先將源碼貼出來,下面再講。

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

我們在這段代碼中,有看到InputStream對象的獲得和返回,證明這classLoaderWrapper.getResourceAsStream(resource, loader); 個地方就是新建 InputStream 的地方,我們可以從這里入手,繼續往下。

  • 先看classLoaderWrapper 是怎么來的,要干什么事情

    private static ClassLoaderWrapper classLoaderWrapper = new ClassLoaderWrapper();
  • 這里用到的classLoaderWrapper 我搜到的解釋如下:

    • 在MyBatis的IO包中封裝了ClassLoader以及讀取資源文件相關的API。

    • 在ClassLoaderWrapper是一個ClassLoader的包裝器,其中包含了多個ClassLoader對象。
      通過調整多個類加載器的使用順序。使用ClassLoaderWrapper就如同使用ClassLoader對象,ClassLoaderWrapper 會按照指定的順序依次檢測其中封裝的ClassLoader對象,并從中選取第一個可用的ClassLoader完成相關功能

      ClassLoaderWrapper中定義了兩個字段,分別記錄了系統指定的默認加載器(defaultClassLoader)和系統加載器(systemClassLoader)

    • ClassLoaderWrapper的主要功能分為三類:
      getResourceAsURL()
      getResourceAsStream()
      classFormName()

    • 原文鏈接:https://blog.csdn.net/xl3379307903/article/details/80994509

    3) classLoaderWrapper.getResourceAsStream(resource, loader);

    從類路徑中獲取資源,從特定的類加載器開始

    參數解釋:
    resource——要查找的資源
    classLoader – 第一個要嘗試的類加載器

    public InputStream getResourceAsStream(String resource, ClassLoader classLoader) {return getResourceAsStream(resource, getClassLoaders(classLoader));}

    我們可以看到它又接著去調用了他的重載函數,但是我們在去看之前,先看看第二個參數是什么東西吧,不然會接著搞不明白。

    **getClassLoaders(classLoader)**牽扯到的源碼是這樣的:

    ==注意:==這個方法返回是不會存在空值的,疊底的都還有系統類加載器勒

    // 我們傳過來的參數是null,但是我們返回的這個ClassLoader[] 數組,是肯定有值的。 ClassLoader[] getClassLoaders(ClassLoader classLoader) {return new ClassLoader[]{classLoader, /** 此處是null ,我們傳過來的*/ defaultClassLoader, /**此處也是null */ Thread.currentThread().getContextClassLoader(),/**使用當前線程的ClassLoader */getClass().getClassLoader(),/**使用當前類的ClassLoader */systemClassLoader};/**使用系統ClassLoader,即系統的入口點所使用的ClassLoader。 */}

    我們返回接著往下看啊

    4)getResourceAsStream(resource, getClassLoaders(classLoader));

    這個方法的作用就是嘗試從一組類加載器中獲取資源 獲取到了就會返回一個 InputStream 輸入流對象給我們。

    InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {for (ClassLoader cl : classLoader) {if (null != cl) {// try to find the resource as passedInputStream 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 resourceif (null == returnValue) {returnValue = cl.getResourceAsStream("/" + resource);}if (null != returnValue) {return returnValue;}}}return null; }

    下面還接著嵌套了兩個方法,實際作用就是找到文件所在的絕對地址,獲取里面的內容。

    5)cl.getResourceAsStream(resource);

    public InputStream getResourceAsStream(String name) {Objects.requireNonNull(name);URL url = getResource(name);try {return url != null ? url.openStream() : null;} catch (IOException e) {return null;}}

    我debug 時候的圖,給大家看一下吧。 可以看到在這里,

    url.openStream();打開到此URL的連接并返回一個InputStream以從該連接讀取。沒有什么可看的。

    牽扯到的小知識點:

    檢查指定的對象引用不為null 。

    Objects.requireNonNull(name);

    此方法主要用于在方法和構造函數中進行參數驗證,如下所示:

    public Foo(Bar bar) {this.bar = Objects.requireNonNull(bar); }

    自言自語

    未來還很遠,記得給自己加油。

    總結

    以上是生活随笔為你收集整理的Mabatis 源码探究(2)Java 获取mybatis-config.xml的输入流 inputStream对象的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 东京热无码av一区二区 | 涩涩网址 | 二区在线观看 | 在线日韩中文字幕 | 在线免费国产 | 特大黑人巨交性xxxx | 久久艹影院| 182午夜视频 | 九九九久久久久 | 免费视频日韩 | 成年人视频网址 | 亚洲日本视频在线观看 | 国产做爰免费视频观看 | 国产欧美在线视频 | 国产精品久久久久免费 | 高级家教课程在线观看 | 亚洲精品视频一区 | 久本草精品 | 尤物在线观看视频 | 少妇激情一区二区三区视频 | 欧美日韩高清在线播放 | 91在线观看网站 | 国产淫片av片久久久久久 | 亚洲成年人网 | 色月婷婷| 欧美 日韩 国产在线 | 国产淫语对白 | 久久久久久国产精品免费 | 日本啊v在线 | 人妻饥渴偷公乱中文字幕 | 激情综合视频 | 超碰极品 | 伊人久久免费 | 国产精品视频一二三 | 善良的女邻居在线观看 | 天堂av资源网 | 一区二区高清视频 | 99久久久无码国产精品免费蜜柚 | 人人澡澡人人 | 免费性爱视频 | 精品欧美日韩 | 亚洲熟女一区二区三区 | 午夜在线不卡 | 91污网站| 一级视频在线播放 | 韩国一区二区三区视频 | 欧美区一区 | 九九福利| 久久久老熟女一区二区三区91 | 黄色在线免费观看 | 色久网| 欧美精品观看 | 91视频免费观看网站 | 午夜免费一区 | 成人欧美在线观看 | 精品国产一区二区三区在线 | 成人h动漫精品一区二区器材 | 潘金莲裸体一级淫片视频 | 那里可以看毛片 | 中出精品 | 欧美双性人妖o0 | 少妇无套高潮一二三区 | 国产精品扒开腿做爽爽爽男男 | 欧美 日韩 国产 中文 | 夜色在线视频 | 午夜在线视频观看 | 最新国产在线视频 | 精品国产户外野外 | 在线看的av网站 | 久久人人插 | 欧美午夜性春猛交 | 亚洲男人天堂2017 | 日本国产视频 | 影音先锋亚洲精品 | 精品一区二区三区免费毛片 | 久久在线视频免费观看 | 久久精品欧美视频 | √天堂| 激情小视频在线观看 | 免费观看在线高清 | 樱桃国产成人精品视频 | 精品九九九九九 | 激情中文字幕 | 日韩毛片免费观看 | 亚洲国产成人精品激情在线 | jizz高潮| 亚洲国产成人精品女人久久久 | 丁香色欲久久久久久综合网 | 久久av高潮av| 玖草视频在线观看 | 超碰在线色| 先锋影音av资源网站 | 一级美女视频 | 欧美影院一区 | 蜜桃av成人永久免费 | 韩日av一区二区 | 日韩福利一区 | 国产玖玖视频 | 国产精品一二三四 |