spring源码 — 一、IoC容器初始化
IoC容器初始化
注意:本次的spring源碼是基于3.1.1.release版本
容器:具有獲取Bean功能——這是最基本功能,也是BeanFactory接口定義的主要行為,在添加了對于資源的支持之后就是ApplicationContext。對于容器的理解可以是:
- 在一個HashMap中存放著很多bean
- 可以解析依賴并初始化bean
所以IoC初始化主要完成以下任務(wù):
以ClassPathXmlApplicationContext的初始化為例說明初始化過程
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
ClassPathXmlApplicationContext
從這個類的構(gòu)造函數(shù)開始
1.super(parent);
調(diào)用超類AbstractApplicationContext的的構(gòu)造方法,因為這個就是root容器,所以parent是null
- 初始化patternResolver-PathMatchingResourcePatternResolver,按照path解析資源位置
- 初始化StandardEnvironment(非web環(huán)境),提供一些property配置
2.setConfigLocations
- 解析xml的路徑,有可能包含多個配置文件,比如:/WEB-INF/*-context.xml
3. refresh
調(diào)用的是超類AbstractApplicationContext的refresh方法
AbstractApplicationContext
這個類是ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等容器的超類,這些類的初始化都會調(diào)用到超類的refresh方法,refresh主要進(jìn)行以下操作:
- prepareRefresh:解析xml文件中的placeholder,替換為指定值(由子類重寫)
- obtainBeanFactory
- 新建一個beanFactory:DefaultListableBeanFactory
- loadBeanDefinition
- 構(gòu)造XmlBeanDefinitionReader,設(shè)置resourceLoader和Environment
- prepareBeanFactory:設(shè)置beanFactory上下文
- invokeBeanFactoryPostProcessors:調(diào)用實(shí)現(xiàn)了BeanFactoryPostProcessor的類
- registerBeanPostProcessors:注冊bean初始化時候的processor,包括bean init before和after
- initMessageSource
- initApplicationEventMulticaster
- onRefresh:初始化子容器
- registerListeners:注冊實(shí)現(xiàn)了ApplicationListener的listener
- finishBeanFactoryInitialization:初始化配置為lazy-init=false的bean
- finishRefresh:觸發(fā)所有堅挺ContextRefreshedEvent事件的listener
接下來主要關(guān)注obtainBeanFactory,因為容器的創(chuàng)建和初始化就在這個方法中,調(diào)用時序如下:
在AbstractRefreshableApplicationContext.refreshBeanFactory中創(chuàng)建了DefaultListableBeanFactory,并開始加載BeanDefinition,load過程如下:
- 調(diào)用了AbstractXmlApplicationContext.loadBeanDefinitions
- 新建XmlBeanDefinitionReader
- 調(diào)用XmlBeanDefinitionReader.loadBeanDefinitions,主要的load工作在這個類(會使用到父類中的一些方法)中進(jìn)行
XmlBeanDefinitionReader
AbstractBeanDefinitionReader(XmlBeanDefinitionReader父類)
這個類中主要對資源進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換為Document之后交給DefaultBeanDefinitionDocumentReader
循環(huán)取出所有配置,針對每個配置進(jìn)行l(wèi)oad
每個配置的資源轉(zhuǎn)換如下:
location->resource->encodeResource->inputStream->document
DefaultBeanDefinitionDocumentReader
- 解析document為BeanDefinition并注冊
- 調(diào)用容器的DefaultListableBeanFactory.registerBeanDefinition將BeanDefinition注冊到beanDefinitionsMap
轉(zhuǎn)載于:https://www.cnblogs.com/sunshine-2015/p/5982714.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的spring源码 — 一、IoC容器初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【unity3d study ----
- 下一篇: Hibernate抓取策略