SpringBoot启动之refreshContext
这篇主要要通过refreshContext方法来将SpringBoot是如何初始化ioc容器的。
refreshContext
在SpringBoot中的run方法中,调用refreshContext()方法,进而调用 AbstractApplicationContext类中的refresh()方法。然后分析每个方法的代码,来看这些方法的作用。
1  | 
  | 
prepareRefresh 准备刷新方法
这个方法的作用就是为了接下来的refresh进行的准备。主要的有两个过程
- 调用
initPropertySources()方法进行propertySource的初始化。 - 验证有没有缺失的必要的Property属性。
 
initPropertySources 初始化propertySource
调用实现类的initPropertySources,根据debug的结果,进入到了子类GenericWebApplication类中,对servletContex进行属性设置。如下图中所展示的。

obtainFreshBeanFactory 获得beanFactory
该方法依靠refreshBeanFactory()来只是bean工厂的实际刷新。因为SpringBoot在ApplicationContext已经持有一个类型为DefaultListableBeanFactory类型的beanFactory。所以可以直接返回。
prepareBeanFactory准备BeanFactory
配置BeanFactory的标准上下文特征。主要体现在一下几个方面:
- 设置classLoader和bean名称的解析策略等。
 - 设置以
Aware结尾的callback接口函数。通过对这些接口的实现。来达到对环境设置的目的。如可继承ResourceLoaderAware接口,来设置资源加载器,来实现自定义的资源加载。 - 使用特定的自动装配值注册特殊依赖关系类型。如
beanFactory.registerResolvableDependency(ApplicationContext.class, this); - 设置环境相关的bean.如
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); 
postProcessBeanFactory
允许在上下文子类中对bean进行后处理。调用相关方法完成对beanFactory的后置处理其的加载。
在之后的invokeBeanFactoryPostProcessors实例化并调用所有已注册的BeanFactoryPostProcessor bean。在方法registerBeanPostProcessors中实例化并注册所有BeanPostProcessor bean。
initMessageSource 初始化MessageSource
1  | protected void initMessageSource() {  | 
在debug时的结果,因为SpringBoot默认实现类Message,所以容器会加载SpringBoot配置好的国际化配置文件。如图中的basenameSet;
onRefresh
在这一步,SpringBoot会根据应用类型来判断,如果是web应用,则会启动默认的web容器,如tomcat。
它回去找所有的类型为ServletWebServerFactory的类。然后获取第一个getBeanFactory().getBean(beanNames[0], ServletWebServerFactory.class);进行bean注入。这样通过注入的bean就能够启动web容器了。

SpringBoot中默认实现有以上几种。
registerListeners 注册listeners
在这一步,注册类型为ApplicationListener的所有listeners;
finishBeanFactoryInitialization 完成所有非懒加载的bean的初始化
finishRefresh 完成刷新
这步有以下几个操作。
clearResourceCaches方法。 清空context-level的缓存。initLifecycleProcessor方法,用来设置生命周期processer- 发布最后的事件(
ContextRefreshedEvent) 
以上就完成了refresh方法中的所有操作。