源码地址:https://github.com/spring-projects/spring-framework
仓库地址:https://gitcode.net/qq_42665745/spring/-/tree/06-application-context
应用上下文
实现应用上下文的核心类:
1.ApplicationContext:Spring 应用上下文的标准接口,提供了丰富的企业级功能,如国际化、事件发布、资源处理等
2.ConfigurableApplicationContext:增加了一些配置上下文的额外操作方法。提供了启动、停止、刷新和关闭应用上下文的方法。
3.AbstractApplicationContext:实现了 refresh() 方法来刷新上下文,以及其他管理和配置上下文的通用逻辑。
4.AbstractRefreshableApplicationContext:提供了一些支持动态刷新配置的能力,比如重新加载配置文件。
5.AbstractXmlApplicationContext:实现了从XML文件加载Bean定义的逻辑
6.ClassPathXmlApplicationContext:指定从类路径(classpath)中加载 XML 文件来初始化 Spring 容器
操作Bean的两个关键接口:
1.BeanFactoryPostProcessor:
- 作用:在 Bean 实例化之前,对 Bean 的定义信息 BeanDefinition 进行修改
- 执行时机:容器refresh阶段
2.BeanPostProcessor:
- 作用:在 Bean 对象实例化、属性注入之后自定义修改 Bean 对象
- 执行时机:Bean实例化阶段
容器初始化执行流程:
1.使用ClassPathXmlApplicationContext加载配置文件,然后刷新容器
- 创建一个DefaultListableBeanFactory容器,读取XML加载Bean定义到容器中
- 获取到刚初始化的容器
- 执行所有注册的BeanFactoryPostProcessor,使用getBeansOfType取出BeanFactoryPostProcessor的所有子类,然后初始化Bean实例,封装成一个map,遍历map依次执行他们的postProcessBeanFactory方法
- 注册所有BeanPostProcessor,使用getBeansOfType取出BeanPostProcessor的所有子类,然后初始化Bean实例,封装成一个map,遍历map依次加入到容器中存储,Bean实例化时使用
- 初始化所有Bean
2.初始化Bean时分3步:
- 反射初始化Bean对象
- 属性注入
- 执行所有的BeanPostProcessor方法