Spring IOC容器的初始化過(guò)程:
1. BeanDefinition的資源定位
? ? ? ? 即Bean定義的資源的定位病曾,由ResourceLoader通過(guò)Resource接口實(shí)現(xiàn)背镇,類似于容器尋找數(shù)據(jù)的過(guò)程怠褐,Spring提供了提供了不同的Resouce讀取器,如FileSystemXMLApplicationContext提供了充文件系統(tǒng)載入馏艾,ClassPathXmlApplicationContext可以從Class Path中載入昨悼,XmlWebApplicationContext可以在Web容器中載入等歼捐。通過(guò)以FileSystemXMLApplicationContext為例,getResourceByPath你画,調(diào)用refreshFactory()啟動(dòng)調(diào)用抵碟。
2.BeanDefinition資源載入
? ? ? 即把用戶定義好的bean轉(zhuǎn)化成IOC容器內(nèi)部的數(shù)據(jù)結(jié)構(gòu)(即BeanDifinition),即POJO對(duì)象在IoC容器中的抽象坏匪;以FileSystemXMLApplicationContext為例拟逮,AbstractApplicationContext調(diào)用refresh接口,然后調(diào)用DefaultListableFactory的loadBeanDefinitions方法初始化XmlBeanDefinitionReader适滓,然后解析xml文件完成BeanDefinition載入到Ioc容器中秫逝。
3. 注冊(cè)BeanDifinition
? ? ? 即向IoC容器注冊(cè)BeanDifinition,通過(guò)調(diào)用BeanDefinitionRegistry接口的registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException方法來(lái)實(shí)現(xiàn)合愈。Bean資源載入IoC容器后呻疹,Bean的信息已經(jīng)在IoC容器中構(gòu)建了數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)存儲(chǔ),但是這些數(shù)據(jù)還不能夠提供給IoC容器直接使用蕊苗,需要進(jìn)行注冊(cè)之后才能夠檢索和使用沿后。簡(jiǎn)而言之,在IoC容器將BeanDefinition存入到一個(gè)HashMap(DefaultListableBeanFactory屬性的Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256)朽砰,256是初始化容量)中尖滚,通過(guò)這個(gè)HashMap來(lái)維護(hù)這些Bean喉刘。注冊(cè)的過(guò)程是使用Synchronized代碼塊,來(lái)保證數(shù)據(jù)的一致性漆弄,Map<String, BeanDefinition> beanDefinitionMap中的key為beanName睦裳,如果有重復(fù)的beanName,則拋出異常撼唾。