天天看點

IOC容器構造之資源檔案定位源碼分析

接着上一篇順藤摸瓜,Spring版本3.2.16,代碼調試工具Eclipse,沒有可直接導入Eclipse源碼的同志可在下方留言,寡人免費贈送一份。接下來以ApplicationContext容器系列為例,通過分析ApplicationContext的實作來分析資源定位的相關源碼。

ApplicationContext是一個接口,它的主要實作有兩個,FileSystemXmlApplicationContext和ClassPathXmlApplicationContext。

IOC容器構造之資源檔案定位源碼分析

不同的實作對應不同的加載方式。FileSystemXmlApplicationContext從檔案系統加載配置檔案,ClassPathXmlApplicationContext從類路徑下加載資源檔案,能讓人”望文生義“哇。接下來我們就以常用的ClassPathXmlApplicationContext為例,進行深入的分析。

進入ClassPathXmlApplicationContext類中,我們會發現這個類有很多個構造函數,根據我們一般的用法

ApplicationContext ap = new ClassPathXmlApplicationContext(“xxxxx.xml”);在執行個體化ClassPathXmlApplicationContext的時候調用的是其參數為String類型的構造函數,而這個函數會調用初始化IOC容器的一個函數。

IOC容器構造之資源檔案定位源碼分析

其中,這個refresh方法非常重要,它是IOC容器初始化的一個入口。我們可以把這個refresh方法了解成啟動IOC容器的方法。這個方法的具體實作在ClassPathXmlApplicationContext的父類AbstractApplicationContext中,關于ClassPathXmlApplicationContext的繼承體系,第一張圖中展示的很清晰。

進入refresh方法,可以發現這個方法做了很多事情,但我們關心的是Xml的讀取。

IOC容器構造之資源檔案定位源碼分析

順着obtainFreshBeanFactory方法,進入到AbstractRefreshableApplicationContext的refreshBeanFactory方法,這個方法的主要功能就是建立預設的IOC容器和Xml配置檔案的相關操作。

IOC容器構造之資源檔案定位源碼分析

BeanFactory是Spring的基礎容器,它的主要繼承體系如圖:

IOC容器構造之資源檔案定位源碼分析

其中DefaultListableBeanFactory類是BeanFactory的預設實作,其它一些容器的實作都是在這個類的基礎上進行功能擴充。

進入loadBeanDefinitions方法,方法裡定義了一個XmlBeanDefinitionReader類型的對象,這個對象的作用就是讀取Xml配置檔案。

IOC容器構造之資源檔案定位源碼分析

進入loadBeanDefinitions方法,我們會看到有兩種方式加載配置檔案,一種是從Resource類型的路徑中加載,還有一種是從String類型的路徑中加載。

IOC容器構造之資源檔案定位源碼分析

順着這條路一直往下走,進入AbstractBeanDefinitionReader的loadBeanDefinitions方法

IOC容器構造之資源檔案定位源碼分析

這個方法主要做了三件事,分别是擷取資源讀取器,定位具體的配置檔案路徑和加載配置檔案。本篇文章的重點找到了,那就是定位具體的配置檔案路徑,如何定位的呢?進入DefaultResourceLoader的getResource方法。為什麼進入的是DefaultResourceLoader類呢?進入擷取資源讀取器的方法中,我們來到了AbstractBeanDefinitionReader類,getResourceLoader方法就傳回了一個資源讀取器對象,沒什麼好看的,重點是setResourceLoader方法,通過Eclipse檢視這個方法被調用的地方是在AbstractXmlApplicationContext的loadBeanDefinitions方法中。

IOC容器構造之資源檔案定位源碼分析

通過AbstractXmlApplicationContext的繼承體系可以知道AbstractApplicationContext是AbstractXmlApplicationContext的父類,而AbstractApplicationContext又是DefaultResourceLoader的子類,那getResourceLoader方法傳回的對象自然也就是DefaultResourceLoader類型的了。進入DefaultResourceLoader的getResource方法。

IOC容器構造之資源檔案定位源碼分析

這個方法是取得配置檔案路徑的具體實作,也就是實作了如何定位配置檔案的功能,代碼很簡單,邏輯也很清楚。分别定位路徑是以classpath為辨別,以URL為辨別和既不是以classpath為辨別,也不是以URL辨別的情況。既不是classpath也不是URL的情況是什麼情況呢?檔案系統的方式,比如本文中的”xxxxx.xml“,它的預設實作在FileSystemXmlApplicationContext類中。FileSystemXmlApplicationContext類中的這個方法是用protected修飾的,也就是說我們可以重寫這個方法來實作我們自己的定位資源檔案路徑的方式。

資源檔案的定位大緻已分析完,接下來便是加載和解析配置檔案。未完待續。。。。。。