AbstractApplicationContext
是 ApplicationContext
的一个抽象实现类。和普通的 BeanFactory
不同的是,ApplicationContext
可以检测到它的内部 BeanFactory
中定义的特殊 Bean:自动完成 BeanFactoryPostProcessor
、BeanPostProcessor
、ApplicationListener
的注册。
按照惯例,先来看下 AbstractApplicationContext
的继承结构,嗯,你会发现挺复杂的
不过不要紧,我们只关心它的 refresh
方法实现。refresh
方法来自 ConfigurableApplicationContext
接口,关于它的功能描述如下:
加载或刷新配置的持久化,这些配置可以来自 XML 文件、properties 文件、关心数据库等等。因为该方法是一个启动方法,如果失败了,它应该销毁已经创建的单例,以避免出现悬挂资源(dangling resources),换句话说,要么实例化所有的单例,要么一个也不实例化。
refresh 代码跟踪
接下来看下 refresh 方法的实现。
prepareRefresh
这里是做一些准备工作,包括设置开始时间、active 状态、PropertySources 的初始化等等
1 | protected void prepareRefresh() { |
obtainFreshBeanFactory
告诉子类刷新内部的 BeanFactory,然后返回刷新后的 BeanFactory
1 | refreshBeanFactory(); |
GenericApplicationContext
中的 refreshBeanFactory
实现如下:
1 | protected final void refreshBeanFactory() throws IllegalStateException { |
它只是设置下 SerializationId,实际的 beanFactory 初始化是在创建时完成的
1 | public GenericApplicationContext() { |
当然 refreshBeanFactory
也可以有其他的实现方式。
getBeanFactory
比较简单,就是返回已创建的 beanFactory
prepareBeanFactory
配置 BeanFactory 的标准 context 特征,例如设置 context 的 class loader 和 post processor
1 | protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { |
postProcessBeanFactory
对 BeanFactory 进行后处理,默认的实现为空,交给子类去扩展。可以对 beanFactory 进行想要的操作。比如 GenericWebApplicationContext
的实现如下:
1 | protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { |
invokeBeanFactoryPostProcessors
调用 BeanFactoryPostProcessor
1 | protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { |
首先通过 getBeanFactoryPostProcessors
方法取出已经注册到 BeanFactory 中的所有BeanFactoryPostProcessor
,然后交给 invokeBeanFactoryPostProcessors
方法去处理
处理流程
主要分为两个阶段:首先处理 BeanDefinitionRegistryPostProcessor
接口的回调,然后处理 BeanFactoryPostProcessor
接口的回调
BeanDefinitionRegistryPostProcessor 接口回调
这是第一个阶段,处理实现了 BeanDefinitionRegistryPostProcessor
接口的 bean 的回调。
判断 beanFactory 是否为 BeanDefinitionRegistry
类型的实例
是 BeanDefinitionRegistry 类型的实例
首先处理方法入参中传入的 beanFactoryPostProcessors,分别调用其 postProcessBeanDefinitionRegistry
方法
1 | for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { |
然后从 beanFactory 中获取所有实现了 BeanDefinitionRegistryPostProcessor
接口和 PriorityOrdered
接口的 bean,分别调用其 postProcessBeanDefinitionRegistry
方法
1 | // 取出所有实现了 BeanDefinitionRegistryPostProcessor接口的beanName |
接着是 beanFactory 中实现了 BeanDefinitionRegistryPostProcessor
接口和 Ordered
接口的 bean,分别调用其 postProcessBeanDefinitionRegistry
方法
1 | // 取出所有实现了 BeanDefinitionRegistryPostProcessor接口的beanName |
最后是其他实现了 BeanDefinitionRegistryPostProcessor
接口且还未处理过的 bean,分别调用其 postProcessBeanDefinitionRegistry
方法
1 | boolean reiterate = true; |
因为 BeanDefinitionRegistryPostProcessor
接口 继承自 BeanFactoryPostProcessor
接口,所以还需要回调 BeanFactoryPostProcessor
接口的 postProcessBeanFactory
方法
1 | invokeBeanFactoryPostProcessors(registryProcessors, beanFactory); |
不是 BeanDefinitionRegistry 类型的实例
这个就比较简单了,直接调用 BeanFactoryPostProcessor
的 postProcessBeanFactory
方法
1 | for (BeanFactoryPostProcessor postProcessor : postProcessors) { |
BeanFactoryPostProcessor 接口回调
这里说的 BeanFactoryPostProcessor 不包括接口入参的 beanFactoryPostProcessors,因为在上一步已经处理过了。也不包括 beanFactory 中实现了 BeanDefinitionRegistryPostProcessor
接口的 bean,这种情况也在上一步处理过了。
首先还是要从 beanFactory 中取出所有实现了 BeanFactoryPostProcessor 接口的 beanName
1 | // 取出所有的BeanFactoryPostProcessor的beanName |
按照是否实现了 PriorityOrdered
、Ordered
接口分为 3 类
1 | List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); |
先回调实现了 PriorityOrdered
接口的
1 | sortPostProcessors(priorityOrderedPostProcessors, beanFactory); |
接着是回调实现了 Ordered
接口的
1 | List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(); |
最后是未实现优先级接口的
1 | List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(); |
registerBeanPostProcessors
实例化并且调用所有已注册的 BeanPostProcessor
获取所有实现了 BeanPostProcessor 接口的 beanName
1 | String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); |
按照是否实现了 PriorityOrdered
、Ordered
接口分为 3 类,实现了 MergedBeanDefinitionPostProcessor
接口单独拎出来,用于特殊处理
1 | for (String ppName : postProcessorNames) { |
先注册所有实现了 PriorityOrdered
接口的
1 | sortPostProcessors(priorityOrderedPostProcessors, beanFactory); |
再注册实现了 Ordered
接口的
1 | List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(); |
最后注册所有实现了 MergedBeanDefinitionPostProcessor
接口的
1 | sortPostProcessors(internalPostProcessors, beanFactory); |
initMessageSource
对 messageSource 进行初始化
1 | ConfigurableListableBeanFactory beanFactory = getBeanFactory(); |
initApplicationEventMulticaster
初始化上下文中的事件机制
1 | protected void initApplicationEventMulticaster() { |
onRefresh
留给子类去实现,用于初始化其他特殊的 bean。比如 Spring Boot 中,ServletWebServerApplicationContext
就是在这一步去创建的 web server
1 | protected void onRefresh() { |
ServletWebServerApplicationContext
创建 web server
1 | private void createWebServer() { |
registerListeners
检查 listener bean 并向容器注册
1 | // 先注册 AbstractApplicationContext 中取到的 |
finishBeanFactoryInitialization
完成当前 context 的 beanFactory 的初始化,初始化剩下所有的 singleton bean
1 | // 初始化 conversionService |
finishRefresh
完成当前 context 的 refresh
操作,调用 LifecycleProcessor
的 onRefresh
方法,发布 ContextRefreshedEvent
事件
1 | // Clear context-level resource caches (such as ASM metadata from scanning). |
整体流程
整体流程如下图所示: