一、一切從手動啓動IoC容器開始
第一行代碼:ClassPathResource的作用是起到了資源定位的作用。通常情況下,Spring的配置信息使用文件來描述,通過這樣一行代碼,指明瞭需要加載的資源的位置,並且使用Spring能夠理解的Resource接口的形式將資源描述出來。
第二行代碼:DefaultListableBeanFactory是一個純粹的IoC容器類,它是這個Spring的一個基礎的IoC容器類,其他的一個IoC容器都是以這個類爲基礎進行擴展的。這樣代碼只是定義了一個IoC容器,它不具有任何其他的能力。
第三行代碼:XmlBeanDefinitionReader是一個配置文件讀取器。它實現了BeanDefinitionReader接口,它能夠按照Spring配置文件,將其中的配置信息轉換爲spring內部可以識別的信息(BeanDefinition)。注意,在這裏它的構造函數需要一個BeanDefinitionRegistry類型的參數,BeanDefinitionRegistry接口提供了一個回調函數,通過這個回調函數可以向IoC容器註冊bean的定義信息。DefaultListableBeanFactory實現了這個接口。
第四行代碼:調用loadeBeanDefinitions方法,通過給定的Resource資源,從中讀取出spring的配置信息,轉換爲BeanDefinition,然後再調用BeanDefinitionRegistry的回調函數進行註冊。
通過以上的四行代碼,完成了spring容器的啓動。
二、容器啓動過程
1. 定位
在spring中,使用統一的資源表現方式Resource。根據不同的情況進行不同的選擇。上述程序中,採用了編程式的資源定位方法,使用ClassPathResource定位位於classpath下的資源文件。
2. 加載
在加載這個過程中,主要工作是讀取spring配置文件,解析配置文件中的內容,將這些信息轉換成爲Spring內容可以理解、使用的BeanDefinition。
3. 註冊
加載過配置文件後,就將BeanDefinition信息註冊到BeanDefinitionRegistry中,通常情況下Spring容器的實現類都實現這個接口。
三、資源加載實現
首先看一下XmlBeanDefinitionReader中的loadBeanDefinitions方法的實現