欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于SpringIOC容器启动的refresh()方法详解

程序员文章站 2022-03-22 18:07:44
在SpringIOC容器对Bean配置资源的载入是从AbstractApplicationContext的refresh()方法启动的...

由Debug可以得知,在SpringIOC容器对Bean配置资源的载入是从AbstractApplicationContext的refresh()方法启动的,refresh()是一个模板方法,规定了IOC容器的启动流程,具体逻辑交由子类实现
下面看下源码

public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// 1.调用容器准备刷新的方法,获取当前时间和同步标识
            prepareRefresh();

            // 2.调用子类的refreshBeanFactory()方法,Bean定义资源文件的载入从这里启动
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // 3.为beanFactory配置事件处理器、类加载器等
            prepareBeanFactory(beanFactory);

            try {
                // 4.为容器的某些子类指定特殊的Post事件处理器
                postProcessBeanFactory(beanFactory);

                // 5.调用所有注册的BeanFactoryPostProcesser的Bean
                invokeBeanFactoryPostProcessors(beanFactory);

                // 6.为BeanFactory注册Post事件处理器
                registerBeanPostProcessors(beanFactory);

                // 7.国际化初始化
                initMessageSource();

                // 8.初始化事件传播器
                initApplicationEventMulticaster();

                // 9.调用子类某些特殊的Bean初始化方法
                onRefresh();

                // 10.为上面的事件传播器注册事件监听器
                registerListeners();

                // 11.初始化所有单例Bean
                finishBeanFactoryInitialization(beanFactory);

                // 12.完成初始化
                finishRefresh();
            }

            catch (BeansException ex) {
                // 销毁已创建的Bean
                destroyBeans();

                // 取消刷新并重置标识
                cancelRefresh(ex);

                // Propagate exception to caller.
                throw ex;
            }
		}
	}

上面是Spring4版本,在Spring5中略有不同(最后添加了finally块,调用了resetCommonCaches方法,此方法用于重设公共缓存)。

总结:refresh()方法的主要作用是,在创建IOC容器前,如果已经有容器存在,需要把已有的容器销毁和关闭,以保证在refresh()方法之后的使用的是新创建的IOC容器,他类似于对IOC容器的重启,在新创建的容器中对容器进行初始化,对Bean配置资源进行载入。

本文参考图书:《Spring5核心原理》

本文地址:https://blog.csdn.net/weixin_43967331/article/details/107351903

相关标签: 经验分享 spring