关于SpringIOC容器启动的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核心原理》

猜你喜欢

转载自blog.csdn.net/weixin_43967331/article/details/107351903