基础篇:IoC(九):应用上下文ApplicationContext

一、应用上下文ApplicationContext

代码分支:application-context

应用上下文ApplicationContext是spring中较之于BeanFactory更为先进的IOC容器,ApplicationContext除了拥有BeanFactory的所有功能外,还支持特殊类型bean如上一节中的BeanFactoryPostProcessor和BeanPostProcessor的自动识别、资源加载、容器事件和监听器、国际化支持、单例bean自动初始化等。

BeanFactory是spring的基础设施,面向spring本身;而ApplicationContext面向spring的使用者,应用场合使用ApplicationContext。

具体实现查看AbstractApplicationContext#refresh方法即可。注意BeanFactoryPostProcessor和BeanPostProcessor的自动识别,这样就可以在xml文件中配置二者而不需要像上一节一样手动添加到容器中了。

从bean的角度看,目前生命周期如下:

测试:见ApplicationContextTest

二、源码追踪

2.1 refreshBeanFactory-创建BeanFactory,并加载BeanDefinition

2.2.1 主要是第二步,loadBeanDefinitions方法



2.2.2 invokeBeanFactoryPostProcessors-在bean实例化之前,执行BeanFactoryPostProcessor

我们自定义的BeanFactoryPostProcessor#postProcessBeanFactory方法就在这时候执行的啦:

我们还是来看一下DefaultListableBeanFactory#getBeansOfType吧:

2.2.3 registerBeanPostProcessors-BeanPostProcessor需要提前与其他bean实例化之前注册

注意:这里是BeanPostProcessor,和【2.2.2】的BeanFactoryPostProcessors要区分开。

2.2.4 beanFactory.preInstantiateSingletons();-提前实例化单例bean





疑问:BeanPostProcessor,是什么时候注册到map的?

------就是在registerBeanPostProcessors方法里注册的呀!!

总结:

  1. refreshBeanFactory方法,其实就是解析xml,然后加载bean;
  2. invokeBeanFactoryPostProcessors方法,在bean实例化之前,执行BeanFactoryPostProcessor;
  3. registerBeanPostProcessors-BeanPostProcessor需要提前与其他bean实例化之前注册;
  4. beanFactory.preInstantiateSingletons();-提前实例化单例bean,并执行BeanPostProcessor的前置和后置方法;

2.3 着重了解的内容(与2.2存在重合的地方)

2.3.1 BeanFactoryPostProcessor和BeanPostProcessor的自动识别


这一步,执行了BeanFactoryPostProcessor相关的操作;

在此之前refreshBeanFactory();把相关的BeanFactoryPostProcessor加载了:

2.3.2 单例bean自动初始化

第十节讲述。

2.3.3 AutowiredAnnotationBeanPostProcessor

注意:单独注册了AutowiredAnnotationBeanPostProcessor到beanDefinitionMap里去了。

相关推荐
xieliyu.5 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
明夜之约5 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee5 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Jinkxs5 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
辣机小司5 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
fangdengfu1236 小时前
ES分析系统各个服务日志占用量
java·前端·elasticsearch
云烟成雨TD6 小时前
Spring AI 1.x 系列【51】可观测性技术选型
java·人工智能·spring
星越华夏6 小时前
ESP32-CAM图像传输项目说明文档
java·后端·struts·esp32
unicrom_深圳市由你创科技6 小时前
基于Spring AI框架的RAG应用
人工智能·spring·机器学习
Jinkxs7 小时前
Java 跨域14-Java 与区块链(Hyperledger)集成
java·开发语言·区块链