Context初始化流程

Context初始化流程

1.prepareRefresh

对刷新进行准备,包括设置开始时间、设置激活状态、初始化context环境中的占位符这个动作,根据之类的需求由子类来执行,然后验证是否却是必要的properties。

2.ConfiguratbleListableBeanFactory beanFactory=obtainFreshBeanfactory();

刷新并获得内部的Bean Factory。

3.prepareBeanFactory(beanFactory);

对beanFactory进行准备工作,比如设置类加载器和后置处理器,配置不进行自动装配的类型,注册默认的环境Bean。

4.postProcessBeanFactory(beanFactory);

为context的子类提供后置处理BeanFactory的扩展能力。如果子类想在Bean定义加载完成后,开始初始化上下文之前,做一些特殊逻辑,可以复写这个方法。

5.invokeBeanFactotyPostProcessors(beanFactory);

执行context中注册的beanfactory后缀处理器,这里有两种后置处理器一种是可以注册bean的后缀处理器。另一种是针对beanfactory进行处理的后置处理器。执行顺序是,先按照优先级执行可注册Bean的处理器,再按优先级执行针对Beanfactory的处理器。对springboot来书,这一步会进行BeanDefinition的解析。

6.registerBeanPostProcessors(beanFactory);

按照优先顺序在BeanFactory中注册Bean的后缀处理器,Bean后置处理器可以在Bean初始化前、后执行处理。

7.initMessageSource();

初始化消息源,消息源用来支持消息的国际化。

8.initApplicationEventMulticaster();

初始化应用事件广播器。事件广播器用来向ApplicationListener通知各种应用产生的事件,是一个标准的观察者模式。

9.onRefresh();

是留给子类的扩展步骤,用来让特定的Context子类初始化其他的bean。

10.registerListeners();

把实现了ApplicationListener的Bean注册到事件广播器,并对广播器中的早期未广播事件进行通知。

11.finishBeanFactoryInitialization(beanFactory);

冻结所有的Bean描述信息的修改,实例化非延迟加载的单例Bean

12.finishRefresh();

完成上下文的刷新工作,调用LifecycleProcessor的onFresh()方法以及发布ContextRefreshedEvent事件。

13.resetCommonCaches();

在finally中,执行第13步,重置公共的缓存,比如ReflectonUtils中的缓存、AnnotationUtils中的缓存等等。

文章目录