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