1. 程式人生 > >Spring技術內幕之IOC容器的實現(01)-IOC容器初始化過程

Spring技術內幕之IOC容器的實現(01)-IOC容器初始化過程

Spring IOC容器的初始化過程


Spring IOC容器的初始化過程主要包括BeanDefinition的Resouce定位/載入/註冊三個基本過程。Spring把這三個過程的實現分別放在不同的模組下,通過這樣的設計方式可以使使用者更加靈活地對這個三個過程進行裁剪和自定義擴充套件,定製屬於自己的IOC容器的初始化過程。


第一個過程是Resouce定位過程。Resouce定位指的是BeanDefinition的資源定位,它由ResouceLoader通過統一的Resouce介面完成,Resouce
對各種形式的BeanDefinition提供了統一介面。比如:在檔案系統中Bean的定義資訊可以使用FileSystemResouce來進行抽象,在類路徑中的


Bean的定義資訊可以使用ClassPatchResouce來使用等,這個Resouce資源定位的過程類似於容器尋找資料的過程,就好比用水桶裝水先找到水源一樣。


第二個過程是BeanDefinition的載入。這個過程是把使用者定義好的Bean表示成IOC容器內部的資料結構,而這個容器內部資料結構就是BeanDefinition。BeanDefinition實際上就是POJO物件在IOC容器中的抽象,通過對BeanDefinition定義的資料結構,使IOC容器能夠方便地對POJO物件進行管理。


第三個過程是向IOC容器註冊BeanDefinition的過程。這個過程通過呼叫BeanDefinitionRepository介面的實現來完成。這個註冊過程把載入過程中解析得到的BeanDefinition向IOC容器進行註冊,在IOC容器的內部將BeanDefinition注入到ConcurrentHashMap物件中,通過KEY獲取指定Bean的資訊。
在JDK1.5起增加了concurrent包提供了執行緒安全的ConcurrentHashMap
ConcurrentHashMap程式碼中可以看出,它引入了一個“分段鎖”的概念,具體可以理解為把一個大的Map拆分成N個小的HashTable,根據key.hashCode()來決定把key放到哪個HashTable中。
在ConcurrentHashMap中,就是把Map分成了N個Segment,put和get的時候,都是現根據key.hashCode()算出放到哪個Segment中
ConcurrentHashMap類的設計:
 public class ConcurrentHashMap<K, V> extends AbstractMap<K, V>
        implements ConcurrentMap<K, V>, Serializable




IOC容器初始化過程一般不包含Bean依賴注入的實現,在Spring IOC設計中,Bean定義的載入和依賴注入的過程是兩個獨立的過程,依賴注入一般發生在應用第一次通過getBean向容器索取Bean的時候。但是有一個例外指得注意:使用IOC容器時有個預例項化配置,也就是在xml檔案中為Bean定義lazyinit屬性,那麼這個Bean的依賴注入在IOC容器初始化時就預先完成了,而不需要等到整個初始化完成以後,第一呼叫getBean時才觸發。