springboot IOC容器初始化流程 
IOC容器的初始化是在 AbstractApplicationContext.run中完成的。
在refresh方法中主要做这几件事:
- 准备
BeanFactory,会给BeanFactory设置很多属性,如类加载器、Environment等。 - 执行
BeanFactoryPostPresser(后置处理器),这一阶段会扫描要放入容器中的Bean信息,得到对应的。BeanDefinition(只扫描,不创建)。 - 注册
BeanPostProsser。 - 启动
tomcat。 - 实例化容器中非懒加载的单例Bean。
 - 容器初始化完成后做一些收尾工作,如清除缓存等。
 
在IOC容器初始化过程中,首先准备BeanFactory并执行BeanFactoryPostProsser(BeanFactory后置处理器),然后注册BeanPostProsser(Bean后置处理器),启动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
上一篇:Centos7关闭邮件服务|下一篇:docker部署openvpn