Skip to content

springboot IOC容器初始化流程

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

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

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

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

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

    }
}

最近更新:10/11/2024, 5:03:40 AM

原文链接:SpringBoot IOC容器初始化流程

|下一篇:docker部署openvpn