美文网首页
SpringBoot源码分析之refresh方法解析

SpringBoot源码分析之refresh方法解析

作者: handsomemao666 | 来源:发表于2020-08-23 15:13 被阅读0次

Spring容器中最核心的方法就是refresh方法,现在我们就一起探究下这个refresh方法的内部原理吧。
refresh的基础实现是在核心类AbstractApplicionContext中,代码和简单解释如下:

public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // Prepare this context for refreshing.
            prepareRefresh();

            // Tell the subclass to refresh the internal bean factory.
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // Prepare the bean factory for use in this context.
            prepareBeanFactory(beanFactory);

            try {
                // Allows post-processing of the bean factory in context subclasses.
                postProcessBeanFactory(beanFactory);

                // Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);

                // Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);

                // Initialize message source for this context.
                initMessageSource();

                // Initialize event multicaster for this context.
                initApplicationEventMulticaster();

                // 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();

                // 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();
            }
        }
    }

接下来会对每个子方法做详细的介绍:

1. prepareRefresh()

  • 容器状态设置
  • 初始化属性设置
  • 检查必备属性是否存在

2. obtainFreshBeanFactory()

通知子类刷新内部的beanFactory

3. prepareBeanFactory(beanFactory)

beanFactory初始化

4. postProcessBeanFactory(beanFactory)

子类中对beanFactory的初始化

5. invokeBeanFactoryPostProcessors(beanFactory)

执行BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor两种后置处理器,主要作用是在bean实例化之前,对beanDefinition进行自定义的调整和修改。

该方法内部的主要逻辑是将两种类型的后置处理器分类、排序、然后执行。。

6. registerBeanPostProcessors(beanFactory)

注册bean后置处理器

7. initMessageSource()

初始化国际化信息设置

8. initApplicationEventMulticaster()

初始化该容器的事件广播器

9. onRefresh()

在子类中对特定的类进行特定的refresh处理

10. registerListeners()

注册监听器

11. finishBeanFactoryInitialization(beanFactory)

完成bean的初始化,该方法是refresh()的核心方法

12. finishRefresh()

完成refresh()方法

相关文章

网友评论

      本文标题:SpringBoot源码分析之refresh方法解析

      本文链接:https://www.haomeiwen.com/subject/mubijktx.html