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 – 第一個要嘗試的類加載器
我們可以看到它又接著去調用了他的重載函數,但是我們在去看之前,先看看第二個參數是什么東西吧,不然會接著搞不明白。
**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对象的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 为什么想要去探究Mybatis源码?(1
- 下一篇: Error creating bean
