包含最重要的Spring方法    refresh



内部调用顺序

    public void refresh() throws BeansException, IllegalStateException {

        synchronized (this.startupShutdownMonitor) {

            // Prepare this context for refreshing.        

            // 初始化环境,包含Environment    StandardEnvironment {activeProfiles=[], defaultProfiles=[default], propertySources=[systemProperties,systemEnvironment]}

            prepareRefresh();



            // Tell the subclass to refresh the internal bean factory.

            // 初始化BeanFactory,    DefaultListableBeanFactory

            // 包含

            // 1、加载Resources    XmlBeanDefinitionReader    ResourcePatternResolver         DefaultResourceLoader                  

            // 2、根据Resources加载BeanDefinition    BeanDefinitionParserDelegate     BeanDefinitionHolder        GenericBeanDefinition                  

            // 3、注册BeanDefinition到BeanFactory中    BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());

            // 4、通知Bean定义事件    getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));        内部将依赖的BeanDefinition进行依赖添加innerBeanDefinitions,beanReferences    

            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();



            // Prepare the bean factory for use in this context.

            // 对BeanFactory进行预处理

            // 1、设置默认值,如classloader等    

            // 2、设置默认处理对象ApplicationContextAwareProcessor

            // 3、设置被忽略的依赖接口    ignoredDependencyInterfaces,如ResourceLoaderAware,ApplicationEventPublisherAware等

            // 4、设置被忽略的依赖类    resolvableDependencies,如BeanFactory.class等

            // 5、如果包含运行时注入类    loadTimeWeaver,则添加BeanFactoryProcess对象

            // 6、注册一些默认Bean    beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());

            //                 beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());

            //                 beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());

            prepareBeanFactory(beanFactory);



            try {

                // Allows post-processing of the bean factory in context subclasses.

                postProcessBeanFactory(beanFactory);



                // Invoke factory processors registered as beans in the context.

                // 1、执行    BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry注册前时间处理

                // 2、通过beanFactory.getBeansOfType(BeanDefinitionRegistryPostProcessor.class, true, false);    获取所有的BeanDefinitionRegistryPostProcessor

                // 3、执行invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);    执行注册前的BeanFactoryProcessor

                // 4、invokeBeanFactoryPostProcessors(registryPostProcessorBeans, beanFactory);    执行注册的

                // 5、invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);

                invokeBeanFactoryPostProcessors(beanFactory);



                // Register bean processors that intercept bean creation.

                // 1、注册BeanPostProcessors

                registerBeanPostProcessors(beanFactory);



                // Initialize message source for this context.

                // 1、初始化DelegatingMessageSource    信息国际化

                initMessageSource();



                // Initialize event multicaster for this context.

                // 1、初始化Spring事件体系            SimpleApplicationEventMulticaster,通过multicastEvent方法可以对增加的ApplicationListener通知消息

                initApplicationEventMulticaster();



                // Initialize other special beans in specific context subclasses.

                // 初始化其他Bean,暂为空方法

                onRefresh();



                // Check for listener beans and register them.

                // 1、对Listeners进行注册

                registerListeners();



                // Instantiate all remaining (non-lazy-init) singletons.

                // 对Bean进行初始化,执行BeanPostProcessors

                finishBeanFactoryInitialization(beanFactory);



                // Last step: publish corresponding event.

                // 刷新生命周期对象

                // 发送初始化结束信号

                // 在全局上下文视图中注册ApplicationContext

                // LiveBeansView.registerApplicationContext(this);

                finishRefresh();

            }



            catch (BeansException ex) {

                // Destroy already created singletons to avoid dangling resources.

                destroyBeans();



                // Reset ‘active’ flag.

                cancelRefresh(ex);



                // Propagate exception to caller.

                throw ex;

            }

        }

    }