八、【源码】Aware感知对象

源码地址: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 配置中指定的销毁方法。
相关推荐
2601_962106648 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
RuoyiOffice9 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
2601_962106649 小时前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
杨凯凡10 小时前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard10 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android10 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤10 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
aiks_yuan13 小时前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
Flynn Liang15 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
Flynn Liang15 小时前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j