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方法中的所有操作。