spring AbstarctApplicationContext类中refresh代码分析

Spring容器启动的整个过程实际上就包含在AbstractApplicationContext的refresh方法中

public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {

            /** 这里会重新设置容器启动时间和启动标志字段*/
            prepareRefresh();
            
            /**
             * 通知子类刷新beanFactory,具体实现在 AbstractRefreshableApplicationContext中,
             * 1.如果当前Context持有beanFactory,则先destoryBeans,再关闭beanFactory
             * 2.createBeanFactory:用父容器创建一个DefaultListableBeanFactory,(这里如果父容器为ConfigurableApplicationContext,
             * 则返回该context持有的beanFacotry,否则直接返回父BeanFactory。ps:这里可能就是context和beanFactory的区分点)
             * 3.customizeBeanFactory:根据参数设置是否允许子类定制DefaultListableBeanFactory。
             * 4.loadBeanDefinitions:加载BeanDefinitions,具体实现在AbstractXmlApplicationContext中。(TODO:后面会详细扩展讲解)
             * 并返回子类的beanFactory
             */
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            /**
             * 这个方法主要是为后面实例化bean做一些设置 
             * 1.设置ClassLoader 
             * 2.addPropertyEditorRegistrar,设置用户定义的propertyEditor注册器
             * 3.addBeanPostProcessor,设置ApplicationContextAwareProcessor, 处理ApplicationContextAware实现接口的Bean。
             * 4.ignoreDependencyInterface,设置不解析某些接口的依赖关系 
             * 5.registerResolvableDependency,设置特殊接口和bean的绑定关系
             */
            prepareBeanFactory(beanFactory);

            try {

                /** 提供接口给子类修改beanFactory。 */
                postProcessBeanFactory(beanFactory);

                /** 调用注册的BeanFactoryPostProcessor,按照实现的排序接口PriorityOrdered>Ordered>无接口 */
                invokeBeanFactoryPostProcessors(beanFactory);

                /** 按照排序接口,依次注册BeanPostProcessor,后面会按照这个顺序调用 */
                registerBeanPostProcessors(beanFactory);

                /**
                 * 初始化messageSource,(MessageSource接口用于支持国际化)如果context中尤定义id为messageSource
                 * 的MessageSource接口的bean(潜规则),则采用它来解析Message资源,否则采用父容器messageSource,这里会创建一个DelegatingMessageSource,
                 * 避免为空的情况导致调用失败。
                 */
                initMessageSource();

                /**
                 * 初始化并注册ApplicationEventMulticaster,容器事情广播器,同样采用MessageSource类似的潜规则,
                 * 如果容器中有名为applicationEventMulticaster且实现了ApplicationEventMulticaster接口的bean,则注册它,
                 * 否则创建SimpleApplicationEventMulticaster,将它当作默认的广播器。
                 */
                initApplicationEventMulticaster();

                /** 给子类保留的接口,通知子类刷新 */
                onRefresh();

                /** 获取容器中定义的所有ApplicationListener,容器事件监听器,并注册 */
                registerListeners();

                /**
                 * 1.清除用于类型匹配的classLoader 
                 * 2.冻结bean definitions中设置,不能再修改bean的配置
                 * 3.实例化非延迟加载的单例bean,包括由FactoryBean实例化的bean(TODO:需要进一步深挖)
                 */
                finishBeanFactoryInitialization(beanFactory);

                /** 广播ContextRefreshedEvent容器刷新事件。 */
                finishRefresh();
            }

            catch (BeansException ex) {
                // Destroy already created singletons to avoid dangling resources.
                beanFactory.destroySingletons();

                // Reset 'active' flag.
                cancelRefresh(ex);

                // Propagate exception to caller.
                throw ex;
            }
        }
    }

    原文作者:Spring Cloud
    原文地址: https://blog.csdn.net/shuangyue/article/details/8585641
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞