2018-10-06
原文推薦 死磕 Spring
ClassPathResource resource = new ClassPathResource("bean.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);
這段代碼是 Spring 中編程式使用 IOC 容器稻轨,通過(guò)這四段簡(jiǎn)單的代碼,我們可以初步判斷 IOC 容器的使用過(guò)程笑窜。
1妖滔、獲取資源
2惦积、獲取 BeanFactory
3、根據(jù)新建的 BeanFactory 創(chuàng)建一個(gè)BeanDefinitionReader對(duì)象,該Reader 對(duì)象為資源的解析器
4级零、裝載資源
整個(gè)過(guò)程就分為三個(gè)步驟:資源定位完疫、裝載泰鸡、注冊(cè)
資源定位。我們一般用外部資源來(lái)描述 Bean 對(duì)象壳鹤,所以在初始化 IOC 容器的第一步就是需要定位這個(gè)外部資源盛龄。
裝載。裝載就是 BeanDefinition 的載入。BeanDefinitionReader 讀取余舶、解析 Resource 資源啊鸭,也就是將用戶定義的 Bean 表示成 IOC 容器的內(nèi)部數(shù)據(jù)結(jié)構(gòu):BeanDefinition。在 IOC 容器內(nèi)部維護(hù)著一個(gè) BeanDefinition Map 的數(shù)據(jù)結(jié)構(gòu)匿值,在配置文件中每一個(gè)<bean>
都對(duì)應(yīng)著一個(gè)BeanDefinition對(duì)象赠制。
注冊(cè)。向IOC容器注冊(cè)在第二步解析好的 BeanDefinition挟憔,這個(gè)過(guò)程是通過(guò) BeanDefinitionRegistery 接口來(lái)實(shí)現(xiàn)的钟些。在 IOC 容器內(nèi)部其實(shí)是將第二個(gè)過(guò)程解析得到的 BeanDefinition 注入到一個(gè) HashMap 容器中,IOC 容器就是通過(guò)這個(gè) HashMap 來(lái)維護(hù)這些 BeanDefinition 的绊谭。在這里需要注意的一點(diǎn)是這個(gè)過(guò)程并沒(méi)有完成依賴注入政恍,依賴注冊(cè)是發(fā)生在應(yīng)用第一次調(diào)用getBean()
向容器索要 Bean 時(shí)。當(dāng)然我們可以通過(guò)設(shè)置預(yù)處理达传,即對(duì)某個(gè) Bean 設(shè)置 lazyinit 屬性篙耗,那么這個(gè) Bean 的依賴注入就會(huì)在容器初始化的時(shí)候完成。