上一篇介紹了Configuration的屬性,今天就看看屬性的設置過程。程序員
回顧
前面兩篇文章最後都講到最後是經過parse方法調用的parseConfiguration來設置Configuration的屬性的,具體源碼以下圖:面試
能夠看到parseConfiguration方法中幾乎每一行代碼都是調用一個方法,那麼接下來咱們就來一行一行的分析parseConfiguration代碼。mybatis
propertiesElement方法分析
首先第一行執行的是propertiesElement(root.evalNode("properties"));能夠看到是拿到mybatis配置文件中properties節點內容而後執行propertiesElement,咱們看到propertiesElement方法源碼以下圖:學習
上圖已經對這個方法有比較詳細的說明了,這裏在梳理一下,首先這個方法主要分三步,目的是設置Properties這個類,這個類繼承Hashtable只是擴展了一些方法,主流程三步詳解:ui
一、遍歷properties節點的子節點填充到Properties的一個對象中;url
二、獲取properties節點的resource和url屬性,利用Properties類的擴展方法讀取對應文件中的數據,從代碼中能夠看出來兩個屬性至少要存在一個;spa
三、把configuration中的variables設置進properties,最後把properties設置到configuration的variables屬性;3d
從上面這三個步驟咱們能夠得出一些結論:日誌
一、mybatis配置文件的properties節點resource和url屬性至少須要一個,而且resource是要優先與url配置的;對象
二、properties讀取順序是:首先讀取在 properties 元素體內指定的屬性。
而後根據 properties 元素中的 resource或url 屬性讀取類路徑下屬性文件,並覆蓋以前讀取過的同名屬性。最後讀取configuration中的variables(在初始化XMLConfigBuilder時傳遞的參數),並覆蓋以前讀取過的同名屬性。
因此properties參數的優先級是:經過方法參數傳遞的屬性具備最高優先級,resource/url 屬性中指定的配置文件次之,最低優先級的則是 properties 元素中指定的屬性。這個是一個面試題考點。
settings類型屬性設置
接下來是對settings類型的屬性設置,源碼以下圖:
和properties屬性讀取差很少,settings中的屬性屬於Configuration的基礎屬性,限制比較嚴格不容許出現Configuration沒有的屬性。從代碼中能夠看到打印日誌的類也是在settings中設置的。還能夠擴展一些mybatis加載本地文件的類。
總結
今天至關於只梳理了mybatis配置文件中的properties和settings兩個節點的內容,不過咱們也清楚了properties配置的優先級。而且settings中不能設置mybatis不能識別的屬性,自定義日誌輸出類也能夠設置在settings配置中。
接下來還有好幾個擴展配置的加載過程,後面繼續分享。
Java程序員平常學習筆記,如理解有誤歡迎各位交流討論!