1. 程式人生 > >關於專案打成jar包檔案資源找不到的同學們你們有救了!!!

關於專案打成jar包檔案資源找不到的同學們你們有救了!!!

前言

說來話長那麼就長話短了,前幾天一個專案裡面有個操作是載入類的時候去讀取資原始檔夾下面的檔案資源,專案在Eclipse和IDEA上面執行的好好的,BUT一打成jar包說檔案找不到。去網上搜了搜發現,jar包是一個檔案不是一個資料夾當你以流的形式讀取的時候當然找不到了。。。。。。好吧後來我就ClassLoader去載入這個資料夾下面的檔案,可以是可以了可是發現為啥不能像mybatis一樣一群一群的載入呢!~_~(好吧是被負責人逼的),沒辦法看原始碼唄。為了寫長一點那就把看原始碼的過程也寫寫吧(為了自己的強迫症開始吧!!!)

SqlSessionFactoryBean

OK!相信大家在配置mybatis的時候都會配置這個類(SpringBoot沒有顯示的去注入這個類但是我猜測:嗯,隱式給注入然後在配置的)。差不多就像下邊一樣:
 <!-- spring和MyBatis完美整合,不需要mybatis的配置對映檔案 -->  
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" /> 
        <!-- 檔案對映器,指定類檔案 -->
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"
/>
<!-- 自動掃描mapping.xml檔案 --> <property name="mapperLocations" value="classpath:com/chinasoft/ssm/mapper/*.xml"></property> </bean>
網上找的侵必刪。。。。。。發現自己寫的mapper檔案的位置是注入到了這個類裡面,那我們就愉快的去打個斷點吧!
 public void setMapperLocations(Resource[] mapperLocations) {
        this
.mapperLocations = mapperLocations; }
然後我們執行專案從這個方法裡面跳出來,會發現如圖所示的程式碼:

這裡寫圖片描述

如此這樣怎麼辦呢?繼續跟進

這裡寫圖片描述

OK!OK!這裡就該注意了,為什麼呢?因為我們一會用的就是這裡面的程式碼,再往後面跟進就是具體的邏輯了程式碼我們只用到這裡的就可以了,不過出於好奇心我還是會進去看看地! *~_~*

這裡寫圖片描述

ok!來解釋一下275-276吧,275呢就是看你寫的路徑是不是classpath*:開頭的,如果是呢就就再檢查不是符合xxx(資料夾)/xxx(檔案)的形式如果是呢則進去,不是呢則執行283,279行進去是一個遞歸回來再呼叫這個方法傳進來的引數就是這個檔案的資料夾路徑然後去283行裡面得到最終的Resources,那我們進去看看吧:

這裡寫圖片描述

不要憤怒,不要氣餒馬上就要到終點了,看316行:

這裡寫圖片描述

哇!(到這裡已經淚奔了),沒錯,有沒有看到338,right!我們直接到341裡面去吧:

這裡寫圖片描述

喘了一口氣我們發現這裡new了一個UrlResource物件,這個物件是Resource的子類,當然路徑就是如圖啦,建立這個類的時候會new一個URL物件。OK具體的程式碼自己去看吧(其中也用到了一些輔助類)。就這樣我們得到了資源,底層竟然是URL。。。。。。。到這裡我們大題對spring載入資原始檔的過程就熟悉了(本來以為是mybatis做的沒想到啊沒想到,都是騙子都是騙子)

然後最後貼個結果圖結尾吧:
這裡寫圖片描述
具體為什麼要用這個方法請從頭看一遍謝謝!(我怎麼可能給你說是第二張圖片)