目录
二、postProcessBeanFactory源码展示分析
(二)AnnotationConfigServletWebServerApplicationContext
(三)postProcessBeanFactory 主要功能
(二)注册 WebApplicationContextServletContextAwareProcessor
(三)忽略 ServletContextAware 接口的依赖
ExistingWebApplicationScopes 的角色
干货分享,感谢您的阅读!
在很早之前我们单独写过一篇文章《分析SpringBoot启动配置原理》,具体可见:
分析SpringBoot启动配置原理_spring启动加载顺序及原理-CSDN博客文章浏览阅读1.6w次,点赞15次,收藏43次。分析SpringBoot启动配置原理:给出整体初步分析和对应流程图,并从三方面进行展开分析(SpringApplication构造过程分析+SpringApplication启动过程分析+SpringBoot自动配置分析)_spring启动加载顺序及原理https://blog.csdn.net/xiaofeng10330111/article/details/130903779?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171829487016800213028572%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171829487016800213028572&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-130903779-null-null.nonecase&utm_term=%E5%88%86%E6%9E%90SpringBoot%E5%90%AF%E5%8A%A8%E9%85%8D%E7%BD%AE%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4450其中IOC容器的刷新环节可当重点分析,值得在读源码时进行深入分析,我们会从多个方向上再次进行分析回顾和学习。历史其他专项展示:
具体内容 | 具体链接 |
探究Spring BeanFactory | 重看Spring聚焦BeanFactory分析_java beanfactory 实现类-CSDN博客 |
探究Spring ApplicationContext | 重看Spring聚焦ApplicationContext分析_applicationcontext消息资源处理-CSDN博客 |
ApplicationContext vs BeanFactory | 解锁ApplicationContext vs BeanFactory: 谁更具选择性?-CSDN博客 |
探究Spring Environment | 重看Spring聚焦Environment分析-CSDN博客 |
探究Spring BeanDefintion | 重看Spring聚焦BeanDefinition分析和构造-CSDN博客 |
对焦后置处理器 | 聚焦Spring后置处理器分析对比_spring的后置处理器分析-CSDN博客 |
BeanFactory – obtainFreshBeanFactory专项 | 聚焦IOC容器刷新环节obtainFreshBeanFactory初始化BeanFactory专项_refreshbeanfactory-CSDN博客 |
prepareBeanFactory专项 | 聚焦IOC容器刷新环节prepareBeanFactory专项-CSDN博客 |
一、IOC容器的刷新环节快速回顾
我们将AbstractApplicationContext的refresh方法源码提取并进行重点代码标注说明如下:
public abstract class AbstractApplicationContext implements ApplicationContext {
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 准备上下文环境,包括初始化工厂、后置处理器等
prepareRefresh();
// 创建并初始化 BeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 设置 BeanFactory 的类加载器、资源加载器等
prepareBeanFactory(beanFactory);
try {
// 允许子类对 BeanFactory 进行进一步的自定义处理
postProcessBeanFactory(beanFactory);
// 调用 BeanFactoryPostProcessors 进行后置处理
invokeBeanFactoryPostProcessors(beanFactory);
// 注册 BeanPostProcessors,用于对 Bean 实例进行后置处理
registerBeanPostProcessors(beanFactory);
// 初始化消息源
initMessageSource();
// 初始化事件广播器
initApplicationEventMulticaster();
// 初始化其他特殊 Bean
onRefresh();
// 注册关闭钩子
registerListeners();
// 初始化所有剩余的单例 Bean
finishBeanFactoryInitialization(beanFactory);
// 完成上下文刷新
finishRefresh();
} catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn(\"Exception encountered during context initialization - \" +
\"cancelling refresh attempt: \" + ex);
}
// 销毁已创建的 Bean,关闭容器
destroyBeans();
// 重置容器刷新标志,允许再次刷新
cancelRefresh(ex);
// 把异常重新抛出,允许调用者
平台声明:以上文章转载于《CSDN》,文章全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅作参考。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xiaofeng10330111/article/details/140916579