侧边栏壁纸
  • 累计撰写 116 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

SpringBoot IOC容器初始化流程

springboot IOC容器初始化流程

IOC容器的初始化是在 AbstractApplicationContext.run中完成的。

在 refresh方法中主要做这几件事:

  1. 准备 BeanFactory,会给 BeanFactory设置很多属性,如类加载器、Environment等。
  2. 执行 BeanFactoryPostPresser(后置处理器),这一阶段会扫描要放入容器中的Bean信息,得到对应的。BeanDefinition(只扫描,不创建)。
  3. 注册 BeanPostProsser。
  4. 启动 tomcat。
  5. 实例化容器中非懒加载的单例Bean。
  6. 容器初始化完成后做一些收尾工作,如清除缓存等。

在IOC容器初始化过程中,首先准备 BeanFactory并执行 BeanFactoryPostProsser(BeanFactory后置处理器),然后注册 BeanPostProsser(Bean后置处理器),启动 tomcat,最后借助 BeanFactory完成 Bean的实例化。

public void refresh() throws BeansException, IllegalStateException {
    synchronized(this.startupShutdownMonitor) {
            StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
            this.prepareRefresh();

            // 准备beanFactory
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            this.prepareBeanFactory(beanFactory);

            try {
                this.postProcessBeanFactory(beanFactory);
                StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");

                // 执行 BeanFactoryPostPresser
                this.invokeBeanFactoryPostProcessors(beanFactory);

                // 注册 BeanPostProsser
                this.registerBeanPostProcessors(beanFactory);
                beanPostProcess.end();

                // 国际化相关
                this.initMessageSource();

                this.initApplicationEventMulticaster();

                // 初始化特殊的Bean(启动tomcat)
                this.onRefresh();

                this.registerListeners();

                // 实例化容器中非懒加载的单例Bean
                this.finishBeanFactoryInitialization(beanFactory);

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

                this.destroyBeans();
                this.cancelRefresh(var10);
                throw var10;
            } finally {
                // 收尾工作
                this.resetCommonCaches();
                contextRefresh.end();
            }

    }
}
博主关闭了所有页面的评论