源码地址:https://github.com/spring-projects/spring-framework
仓库地址:https://gitcode.net/qq_42665745/spring/-/tree/08-aware
Aware感知对象
理解:
Aware系列接口就是允许Spring容器将特定的框架对象注入到实现这些接口的bean中,让bean拥有获取到Spring容器内部的信息和资源。
实现:
1.创建Aware标记接口,及其他实现接口
2.执行AbstractAutowireCapableBeanFactory#initializeBean依次判断当前bean是否实现了感知接口,实现了哪个就调用哪个,然后这个bean就拥有了获取容器内的其他信息,包括其他bean等等
3.ApplicationContextAware的判断有点特殊,封装成了一个BeanPostProcessor实现的,应该也可以用上面的if-else判断
Bean声明周期总结:
1.读取 XML 配置:
- Spring 容器读取并解析 XML 配置文件。
2.解析 BeanDefinition:
- 根据 XML 配置文件中的信息,Spring 容器解析并创建 BeanDefinition 对象,包含每个 bean 的配置信息。
3.BeanFactoryPostProcessor 修改 BeanDefinition:
- 在实例化任何 bean 之前,Spring 容器会调用所有注册的 BeanFactoryPostProcessor,允许对 BeanDefinition 进行修改。
4.实例化阶段:
- 使用 BeanDefinition 创建 bean 实例(对象),但是此时属性尚未注入。
5.属性注入阶段:
- 对 bean 实例进行属性注入,包括依赖注入。
6.初始化阶段:
- Aware 接口感知:如果 bean 实现了某些 Aware 接口(如 ApplicationContextAware、BeanFactoryAware 等),Spring 会调用相应的感知方法。
- 前置 BeanPostProcessor:调用所有注册的 BeanPostProcessor 的 postProcessBeforeInitialization 方法。
- InitializingBean 接口:如果 bean 实现了 InitializingBean 接口,Spring 调用其 afterPropertiesSet 方法。
- init-method:调用在 bean 配置中指定的初始化方法。
- 后置 BeanPostProcessor:调用所有注册的 BeanPostProcessor 的 postProcessAfterInitialization 方法。
7.使用阶段:
- bean 准备好,可以被应用程序使用。
8.销毁阶段(容器关闭或 bean 被销毁时):
- DisposableBean 接口:如果 bean 实现了 DisposableBean 接口,Spring 调用其 destroy 方法。
- destroy-method:调用在 bean 配置中指定的销毁方法。