public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
// 加载propertysource、environment属性
prepareRefresh();
// 创建一个beanFactory(默认是DefaultListableBeanFactory),
// 创建reader读入beandefination到beandefinationRegistry
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 忽视一些aware,注入之前的一些环境变量、属性
prepareBeanFactory(beanFactory);
try {
// 提供给子容器实现的beanFactory后置处理器
postProcessBeanFactory(beanFactory);
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
// 执行beanfactroy的后置处理器,这里执行以下
// 执行beandefinitionRegistry,用于扩展自动注册beandefinition,其实就是将registry传入由于添加beandefinition
// 这个注册beandefinition是有排序执行的,先执行优先级高的
// 执行beanFactory的后置处理,这个也是排序执行的
invokeBeanFactoryPostProcessors(beanFactory);
// 注册bean的后置处理器,这个注册工程也是有序的
registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
// 初始化国际化,比如说错误码信息
initMessageSource();
// 初始化容器的多播事件
initApplicationEventMulticaster();
// 这里是个钩子函数,提供给子容器,比如web的tomcat启动
onRefresh();
// 注册事件监听器
registerListeners();
// 完成beanFactory的初始化,这里就是对所有的非懒加载的bean进行初始化,
// getbean dogetbean createbean docreatebean 通过反射创建bean实例
// populateBean 注入bean的属性
// initializeBean 初始化bean 初始化前置处理 调用bean的初始化方法 初始化后置处理
// 这里的两个处理就是aop处理的地方,对bean进行增强
finishBeanFactoryInitialization(beanFactory);
// 完成容器刷新初始化,通知容器刷新事件监听,这里很多扩展点
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
contextRefresh.end();
}
}
}
Spring源码<1> refresh方法简述
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 一、refresh()方法之prepareBeanFactory(beanFactory)方法 二、prepare...
- 一、refresh()方法之obtainFreshBeanFactory()方法 二、obtainFreshBea...
- AbstractApplicationContext AbstractApplicationContext 是所有...
- 一、Spring容器入口 Spring通过应用上下文(Application Context)来行使容器的工作。S...
- 从本章开始我们将开始进入Spring容器真正的刷新启动过程,直接点击或者debugger进入AbstractApp...