AbstractApplicationContext.refresh()
1、获取环境参数,加载配置文件
AbstractApplicationContext.prepareRefresh
参数来源
1、"systemProperties":System.getProperties()
2、"systemEnvironment":System.getenv()
2、获取新BeanFactory
AbstractApplicationContext.obtainFreshBeanFactory
1、更新BeanFactory
AbstractRefreshableApplicationContext.refreshBeanFactory
1、销毁原BeanFactory及Bean
2、创建新BeanFactory
3、设置新BeanFactory参数
类加载校验器???
4、加载BeanDefinition
AbstractXmlApplicationContext.loadBeanDefinitions
1、将BeanDefinition按照Bean语义转换成IOC容器内部数据结构
先将xml配置文件解析成DOM对象,再按照SpringBean规则解析DOM,处理结果交由BeanDefinitionHolder持有
1、XmlBeanDefinitionReader.registerBeanDefinitions
2、BeanDefinitionDocumentReader.registerBeanDefinitions
3、解析出BeanDefinition,并注册到容器里面
DefaultBeanDefinitionDocumentReader.processBeanDefinition
1、生成BeanDefinition
BeanDefinitionParserDelegate.parseBeanDefinitionElement
1、获取id、name、aliaes属性,校验name属性是否重复
2、解析BeanDefinition
BeanDefinitionParserDelegate.parseBeanDefinitionElement
1、设置当前Bean处理状态正在解析
2、获取Class名称
3、初步生成BeanDefinition对象
GenericBeanDefinition
只含有ClassName和Class
4、解析当前Bean配置属性信息,设置描述信息
Scope
Singleton
Lazy_init
dependon
initMethod
destoryMethod
5、解析Bean的Meta属性信息
BeanDefinitionParserDelegate.parseMetaElements
6、动态改变方法返回的对象
look-method : parseLookupOverrideSubElements
replaced-method : parseReplacedMethodSubElements
7、解析构造参数设置
constructor-arg : parseConstructorArgElement
8、解析Bean的Property参数,遇到ref参数则嵌套处理其他BeanDefintion
property : parsePropertyElements
这里会对各种参数类型进行判断
ref
value
ref-value
9、常见异常处理
3、如果有包装BeanDefinition则作其他处理
2、装饰BeanDefinitionHolder
3、将BeanDefinitionHolder注册到容器中
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
2、返回新的BeanFactory
3、设置BeanFactory实例化Bean处理方式
AbstractApplicationContext.prepareBeanFactory
1、配置类加载解析方式
ClassLoader类加载器
ExpressionResolver表达式解析器
PropertyEditorRegistrar参数编辑注册器
AbstractBeanFactory#addPropertyEditorRegistrar
2、配置Bean初始化回调处理
添加Bean后置处理器:BeanPostProcessor
AbstractBeanFactory#addBeanPostProcessor
4、设置BeanFactory的后置处理器
AbstractRefreshableApplicationContext.postProcessBeanFactory
1、设置Bean后置处理器
ServletContextAwareProcessor
2、设置忽略历来列表
3、设置当前BeanFactory为不同域环境(Request、Session等)IOC容器
5、对BeanFactory进行后置处理
AbstractRefreshableApplicationContext.invokeBeanFactoryPostProcessors
6、注册Bean的后置处理器(在Bean的创建过程调用)
AbstractApplicationContext.registerBeanPostProcessors
7、对上下文中的消息源进行初始化
AbstractApplicationContext.initMessageSource
8、初始化上下文中的事件机制
AbstractApplicationContext.initApplicationEventMulticaster
9、初始化其他的特殊Bean
AbstractRefreshableApplicationContext.onRefresh
10、检查监听Bean并且将这些监听Bean向容器注册
AbstractApplicationContext.registerListeners
11、实例化所有的(non-lazy-init)单件
AbstractApplicationContext.finishBeanFactoryInitialization
12、发布容器事件,结束refresh过程
AbstractApplicationContext.finishRefresh
13、异常处理