IOC容器構造之註冊BeanDefinition源碼分析

解析完配置文件,接下來便是BeanDefinition的註冊了。爲了不至於每次用到配置信息的時候都去解析一遍配置文件,我們需要將解析結果保存起來。而保存解析結果這個過程就是BeanDefinition的註冊。既然是保存,那就需要一個保存的容器,這個容器就是HashMap。於是BeanDefinition的註冊就變成了將解析之後的BeanDefinition信息保存在HashMap中這樣一個操作。具體實現過程,請看源碼分析。
BeanDefinition註冊開始
註冊從BeanDefinitionReaderUtils類的registerBeanDefinition方法開始。
beanName和別名的註冊
從代碼中可以看出,BeanDefinition的註冊分成了兩部分,通過beanName的註冊和通過別名的註冊。先來分析通過beanName註冊BeanDefinition的方式。
registry的類型
registry此時的類型是DefaultListableBeanFactory,那進入DefaultListableBeanFactory的 registerBeanDefinition方法。
這裏寫圖片描述這裏寫圖片描述
這個方法中先判斷是不是有相同名字的BeanDefinition已經註冊過了,如果有,但是不允許覆蓋,那麼只能讓程序拋出異常。如果沒有相同的名字註冊過,那就執行正常的註冊過程,以beanName爲key,BeanDefinition爲value保存在beanDefinitionMap中。
接下來再看通過別名註冊BeanDefinition的方式。
這裏寫圖片描述
通過別名註冊的方式也比較簡單,如果beanName和別名相同的話,就從aliasMap中刪掉別名。爲什麼要刪掉呢?因爲別名和beanName相同,在獲取BeanDefinition的時候,不管是根據beanName來獲取還是根據別名來獲取,key都是一樣,所以這樣的別名沒別要保存起來。如果beanName和別名不相同的話,就把別名當做key,beanName當做value保存在aliasMap中,到此BeanDefinition註冊完成。當然,在分析源碼的過程中可能有些地方沒有分析到。前面也有提到,我們分析是主線,也就是主要的過程,至於非常細節的部分,感興趣的朋友也可以自己研究下,畢竟Spring源碼是如此的博大精深。
總結:BeanDefinition的註冊過程實質就是將BeanDefinition保存在以beanName爲key,BeanDefinition爲value的Map中的過程。到此IOC容器已經構建好,但這時的IOC容器還只是光有一個殼,沒有內容。我們知道IOC容器的作用是管理對象之間的引用關係,也就是對象之間的引用關係還沒有填充到IOC容器裏面。那麼下面要做的事就是去填充IOC容器。
未完待續。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章