【初探Spring】------Spring IOC(二):初始化過程---簡介

首先咱們先來看看以下一段代碼編程

ClassPathResource resource = new ClassPathResource("bean.xml");
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
        reader.loadBeanDefinitions(resource);

博友是否對這段簡單代碼記憶猶新呢? 這段代碼是編程式使用IOC容器,經過這個簡單的程序咱們初步斷定IOC容器的使用過程:數據結構

一、建立IOC配置文件的抽閒資源,也就是Resource接口。學習

二、建立BeanFactory,DefaultListtableBeanFactory是BeanFactory模式實現類。spa

三、建立一個BeanDefinitionReader對象,該對象爲BeanDefinition的讀取器。xml文件就使用XMLBeanDefinitionReader。code

四、使用Reader來裝載配置文件。loadBeanDefinitions就包括了資源文件的解析和注入過程。xml

經過上面四個步驟咱們就能夠輕鬆地使用IOC容器了,在整個過程能夠剖析爲三個步驟,這三個步驟也是IOC容器的初始化過程:Resource定位、載入、註冊。以下:對象

2015121800001

Resource定位blog

咱們通常使用外部資源來描述Bean對象,因此IOC容器第一步就是須要定位Resource外部資源。Resource的定位其實就是BeanDefinition的資源定位,它是由ResourceLoader經過統一的Resource接口來完成的,這個Resource對各類形式的BeanDefinition的使用都提供了統一接口。繼承

載入接口

第二個過程就是BeanDefinition的載入。BeanDefinitionReader讀取、解析Resource定位的資源,也就是將用戶定義好的Bean表示成IOC容器的內部數據結構也就是BeanDefinition。在IOC容器內部維護着一個BeanDefinition Map的數據結構,經過這樣的數據結構,IOC容器可以對Bean進行更好的管理。

在配置文件中每個<bean>都對應着一個BeanDefinition對象。

註冊

第三個過程則是註冊,即向IOC容器註冊這些BeanDefinition,這個過程是經過BeanDefinitionRegistery接口來實現的。在IOC容器內部實際上是將第二個過程解析獲得的BeanDefinition注入到一個HashMap容器中,IOC容器就是經過這個HashMap來維護這些BeanDefinition的。在這裏須要注意的一點是這個過程並無完成依賴注入,依賴註冊是發生在應用第一次調用getBean向容器所要Bean時。固然咱們能夠經過設置預處理,即對某個Bean設置lazyinit屬性,那麼這個Bean的依賴注入就會在容器初始化的時候完成。

 

通過這三個步驟,IOC容器的初始化過程就已經完成了,後面LZ會結合源代碼詳細闡述這三個過程的實現。下面來看看與IOC容器相關的體系結構圖,以ClassPathXmlApplicationContext爲例(圖片來自:【Spring】IOC核心源碼學習(二):容器初始化過程

2015121800002

左邊黃色部分是 ApplicationContext 體系繼承結構,右邊是 BeanFactory 的結構體系。

相關文章
相關標籤/搜索