Spring - IoC 源码阅读笔记:AbstractApplicationContext - refresh()

in Tech Java

前言

不论是 WebXmlApplicationContext、AnnotationConfigApplicationContext,还是其他 ApplicationContext 接口的间接实现类,最终都继承自 AbstractApplicationContext 。 AbstractApplicationContext 抽象类主要实现了自动注册BeanFactoryPostProcessors、BeanPostProcessors 和 ApplicationListener 等等。

AbstractApplicationContext

refresh() 方法

该方法为 IoC 容器核心启动流程控制,包含刷新上下文、加载配置中的 Bean 定义为 BeanDefinition 、注册 BeanPostProcessors、注册 BeanFactoryPostProcessors 、注册 ApplicationListener 、实例化 Bean , SpringBoot 还包含启动 WebServer 等等。

    @Override
    public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // 设置启动时间和活动标志以及对属性源执行初始化。
            // Prepare this context for refreshing.
            prepareRefresh();

            // 告诉子类刷新 BeanFactory 。
            // Tell the subclass to refresh the internal bean factory.
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // 为 BeanFactory 设置类加载器、语言解析器、添加属性编辑器、ApplicationContextAwareProcessor 后置处理器
            // 指定 BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext  实例
            // 添加 ApplicationListenerDetector 应用监听侦查器、注册默认环境
            // Prepare the bean factory for use in this context.
            prepareBeanFactory(beanFactory);

            try {
                // 允许在上下文子类中对 BeanFactory 进行后处理。
                // 比如注册 Aware 类型的 BeanPostProcessor 、注册 web 类型的 Scope 等。
                // Allows post-processing of the bean factory in context subclasses.
                postProcessBeanFactory(beanFactory);

                // 调用 BeanFactory 后置处理器
                // Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);

                // 注册 Bean 后置处理器并且在 Bean 创建过程中调用
                // Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);

                // 为上下文初始化消息源(国际化)
                // Initialize message source for this context.
                initMessageSource();

                // 为上下文初始化事件多播器(可管理多个应用监听器)
                // Initialize event multicaster for this context.
                initApplicationEventMulticaster();

                // 初始化特定上下文子类中的其他特殊 Bean ,SpringBoot 中用来启动 Web 容器
                // Initialize other special beans in specific context subclasses.
                onRefresh();

                // 注册监听器
                // Check for listener beans and register them.
                registerListeners();

                // 实例化所有剩余非懒加载的单例
                // Instantiate all remaining (non-lazy-init) singletons.
                finishBeanFactoryInitialization(beanFactory);

                // 发布相应事件
                // Last step: publish corresponding event.
                finishRefresh();
            }

            catch (BeansException ex) {
                if (logger.isWarnEnabled()) {
                    logger.warn("Exception encountered during context initialization - " 
            +"cancelling refresh attempt: " + ex);
                }

                // 销毁已经创建的单例
                // Destroy already created singletons to avoid dangling resources.
                destroyBeans();

                // 重置 active 标识
                // Reset 'active' flag.
                cancelRefresh(ex);

                // Propagate exception to caller.
                throw ex;
            }

            finally {
                // Reset common introspection caches in Spring's core, since we
                // might not ever need metadata for singleton beans anymore...
                // 清理可能不需要的缓存
                resetCommonCaches();
            }
        }
    }

方法详解