关于SpringIOC容器启动的refresh()方法详解
程序员文章站
2022-07-06 08:38:50
在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
上一篇: 各位小伙伴们,你们认为减肥时能吃玉米吗