Spring Aware接口:揭秘Bean生命周期中的“先知”角色与源码剖析

1. 引言

在Spring框架中,Bean的生命周期是一个复杂而精细的过程,涉及到Bean的创建、初始化、属性注入以及销毁等多个阶段。为了增强Bean与Spring容器之间的交互能力,Spring提供了一系列Aware接口,这些接口允许Bean在生命周期的不同阶段获取Spring容器的特定资源或信息,从而实现了对全局资源的感知和访问。以下将深入探究Spring Aware接口的原理、实现机制以及它们在Bean生命周期中的作用。


2. Aware接口概述

Aware接口是Spring框架中用于扩展Bean功能的一系列接口,它们允许Bean在初始化之前获取Spring容器中的特定资源或信息。常见的Aware接口包括:ApplicationContextAwareBeanFactoryAwareBeanNameAware等。这些接口提供了一种机制,使Bean能够感知并访问到容器中的上下文信息、Bean工厂以及Bean名称等全局资源。


3. Aware接口的实现机制与源码

3.1 Aware接口实现

  • ApplicationContextAware:允许Bean获取当前的ApplicationContext对象。
public interface ApplicationContextAware {  void setApplicationContext(ApplicationContext applicationContext) throws BeansException;  
}
  • BeanFactoryAwareBeanNameAware等接口也有类似的定义。

3.2 Aware接口的后置处理器

  • Spring通过BeanPostProcessor接口来实现Aware接口的注入逻辑。特别是,对于ApplicationContextAware接口,ApplicationContextAwareProcessor是一个关键的实现。
  • ApplicationContextAwareProcessor源码(简化版):
public class ApplicationContextAwareProcessor implements BeanPostProcessor {  private final ApplicationContext applicationContext;  public ApplicationContextAwareProcessor(ApplicationContext applicationContext) {  this.applicationContext = applicationContext;  }  @Override  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  invokeAwareInterfaces(bean);  return bean;  }  private void invokeAwareInterfaces(Object bean) {  if (bean instanceof ApplicationContextAware) {  ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);  }  // ... 其他Aware接口的处理 ...  }  // postProcessAfterInitialization方法在这里没有使用到  
}

4. Aware接口的调用关系

4.1 Spring容器初始化Bean的过程

  1. createBeanInstance:实例化Bean。
  2. populateBean:属性注入。
  3. initializingBean:初始化对象。
    • 激活Aware:调用BeanPostProcessorpostProcessBeforeInitialization方法,由ApplicationContextAwareProcessor等处理Aware接口。
    • 后置处理器的应用:其他BeanPostProcessor的调用。
    • init方法:如果Bean实现了InitializingBean接口或定义了init-method,则调用相应的方法。

4.2 Aware接口的调用时机

Aware接口的调用时机是在Bean的初始化阶段,即在initializingBean的“激活Aware”步骤中。在这个步骤中,Spring容器会调用BeanPostProcessorpostProcessBeforeInitialization方法,对Bean进行额外的处理。在这个过程中,如果Bean实现了某个Aware接口,Spring会调用相应的回调方法,将相应的资源或信息注入到Bean中。


5. 创意性应用与源码结合

利用Aware接口,可以实现一些创意性的应用。例如,通过实现ApplicationContextAware接口,可以创建一个自定义的配置管理类,用于读取和管理配置文件中的配置项。

示例:自定义配置管理类

@Component  
public class CustomConfigManager implements ApplicationContextAware {  private ApplicationContext applicationContext;  @Override  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  this.applicationContext = applicationContext;  // 从ApplicationContext中获取配置项(例如从配置文件、环境变量等)  String customConfig = applicationContext.getEnvironment().getProperty("custom.config");  // 初始化或更新配置  initConfig(customConfig);  }  private void initConfig(String config) {  // 配置管理的逻辑  }  // ... 其他方法 ...  
}

6. 总结

Spring框架中的Aware接口为Bean提供了与容器交互的能力,允许Bean在初始化之前获取容器中的特定资源或信息。这些接口的实现依赖于Spring容器中的后置处理器,特别是ApplicationContextAwareProcessor。Aware接口在Spring的生命周期中扮演着“先知”的角色,为开发者提供了很大的灵活性。通过合理利用Aware接口,可以实现一些创意性的应用,提高应用程序的灵活性和可扩展性。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/843062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop+Spark大数据技术 实验8 Spark SQL结构化

9.2 创建DataFrame对象的方式 val dfUsers spark.read.load("/usr/local/spark/examples/src/main/resources/users.parquet") dfUsers: org.apache.spark.sql.DataFrame [name: string, favorite_color: string ... 1 more field] dfUsers.show() -----------…

Day7: LeedCode 454. 四数相加 II 383.赎金信 15.三数之和 18.四数之和

详细讲解移步: Day7: LeedCode 454. 四数相加 II 383.赎金信 15.三数之和 18.四数之和-CSDN博客 454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i,…

李飞飞亲自撰文:大模型不存在主观感觉能力,多少亿参数都不行

近日&#xff0c;李飞飞连同斯坦福大学以人为本人工智能研究所 HAI 联合主任 John Etchemendy 教授联合撰写了一篇文章&#xff0c;文章对 AI 到底有没有感觉能力&#xff08;sentient&#xff09;进行了深入探讨。 「空间智能是人工智能拼图中的关键一环。」知名「AI 教母」李…

【数据结构】P1 数据结构是什么、算法怎样度量

1.1 基本概念与术语 数据&#xff1a; 数据是信息的载体&#xff0c;是所有能被计算机识别以及处理的符号。数据元素&#xff1a; 数据元素是数据基本单位&#xff0c;由若干 数据项 组成&#xff0c;数据项是构成数据元素最小的单位。 e . g . e.g. e.g. 数据元素如一条学生记…

[Python] VS python未能启动调试适配器

原因&#xff1a;调试适配器版本与python版本不一致导致无法启动&#xff0c;通常是选用的适配器的版本过新。 作者&#xff1a;东京微风吹凉 https://www.bilibili.com/read/cv12027862/ 出处&#xff1a;bilibili 尝试&#xff1a;更换环境为 Py 3.11&#xff08;64bit&…

Leetcode 2028

思路&#xff1a;1-6之间的的n个数组合起来要变成sum_t mean*(rolls.size()n) - sum(rolls) ; 那么可以先假设每个数都是sum_t / n 其中这个数必须要在1 - 6 之间否者无法分配。 然后可以得出n * (sum_t / n ) < sum ; 需要对余数mod进行调整&#xff0c;为了减少调整的次…

接口测试及接口测试常用的工具详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息…

深入了解 CSS 预处理器 Sass

今天我们来深入探讨一下 CSS 预处理器 Sass。我们将学习什么是 Sass,如何使用它,以及它是如何工作的。 什么是 Sass? Sass 是 syntactically awesome style sheets 的缩写,是一种 CSS 预处理器。它是 CSS 的扩展,为基础 CSS 增加了更多的功能和优雅。普通的 CSS 代码很容…

初学java java script是什么!

java script是什么&#xff01; JavaScript是世界上最流行的语言之一&#xff0c;是一种运行在客户端的脚本语言(Script是脚本的意思) 脚本语言:不需要编译&#xff0c;运行过程中由js 解释器(js 引擎)逐行莱进行解释并执行 现在也可以基于 Nodejs 技术进行服务器端编程 ja…

sklearn监督学习--k近邻算法

sklearn监督学习 一、分类与回归二、泛化、过拟合与欠拟合三、k近邻算法四、分析KNeighborsClassifier五、k近邻算法用于回归优点、缺点和参数 一、分类与回归 监督学习是最常用也是最成功的机器学习类型之一。监督机器学习问题主要有两种&#xff0c;分别叫做分类与回归。分类…

IDEA项目通过 tomcat运行报错: 404 请求的资源不可用

SpringBootVue项目 IDEA运行 Tomcat&#xff0c;自动打开网页报错 HTTP状态 404 - 未找到 类型 状态报告 消息 请求的资源[/WarehouseManagerApi_war/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/9.0.89 但是运行访问 …

c++参数 使用笔记

定义函数&#xff1a; 传两个参数&#xff0c;一个引用&#xff0c;一个返回 public:ThpRecord getLatestRecord(QVector<int>& ids); };ThpRecord faceinit::getLatestRecord(QVector<int>& ids) {ThpRecord entity;// 创建一个 SQL 查询对象QSqlQuery …

【Unity】如何在独立thread中调用协程

【背景】 需要在脚本的分线程中调用协程,结果发现协程必须由主线程调用,不然报错。 但是协程动作的触发点却放在分支thread中触发最理想。如何能够绕过这一限制,使得分支线程满足条件后能直接成功发起协程呢? 【分析】 无法直接start协程那就只能用间接的方法吊起协程。…

【接口测试_04课_Jsonpath断言、接口关联及加密处理】

一、Jasonpath的应用 JsonPath工具网站&#xff1a;JSONPath解析器 - 一个工具箱 - 好用的在线工具都在这里&#xff01; 1、JSONPath的手写与获取 手写JSONPath 1、 $ &#xff08;英文美元符号&#xff09;代表外层的{} . &#xff08;英文句号&#xff09;表示当前…

卷积神经网络-奥特曼识别

数据集 四种奥特曼图片_数据集-飞桨AI Studio星河社区 (baidu.com) 中间的隐藏层 已经使用参数的空间 Conv2D卷积层 ReLU激活层 MaxPool2D最大池化层 AdaptiveAvgPool2D自适应的平均池化 Linear全链接层 Dropout放置过拟合&#xff0c;随机丢弃神经元 -----------------…

echarts快速入门

之前只看过&#xff0c;没写过&#xff0c;来了个新需求了解下echarts功能 官网&#xff1a;https://echarts.apache.org/handbook/zh/get-started 官方参数文档&#xff1a;https://echarts.apache.org/zh/option.html#title 其实大部分问题&#xff0c;去官方参数文档里面都…

【项目教程】FFmpeg+SDL2实现视频播放器

一、前言 学习ffmpeg和sdl&#xff0c;并编写一个视频播放器&#xff0c;是一个很好的音视频开发项目。 虽然关于视频播放器的原理已经有很多人在博客中进行了讲解&#xff0c;但是很多人不提供视频和代码&#xff0c;这也是我写这篇博客的主要原因。 二、在视频播放器中&am…

机器学习 - toad 0.10 和 0.13 之间的区别

Toad 是一个用于机器学习建模、预处理和特征工程的 Python 库。以下是 Toad 库版本 0.10 和 0.13 之间的主要区别&#xff1a; Toad 0.10 初始功能: 版本 0.10 可能包含了 Toad 的基础功能&#xff0c;如数据预处理、特征选择和模型评估。特征选择: 提供了基本的特征选择方法…

【组合数学 放球问题 虚拟点 小于等于转小于】1621. 大小为 K 的不重叠线段的数目

本文涉及知识点 放球问题 组合数学汇总 本题难道分&#xff1a;2198 LeetCode1621. 大小为 K 的不重叠线段的数目 给你一维空间的 n 个点&#xff0c;其中第 i 个点&#xff08;编号从 0 到 n-1&#xff09;位于 x i 处&#xff0c;请你找到 恰好 k 个不重叠 线段且每个线段…

零拷贝(Zero Copy)

目录 零拷贝&#xff08;Zero Copy&#xff09; 1.什么是Zero Copy? 2.物理内存和虚拟内存 3.内核空间和用户空间 4.Linux的I/O读写方式 4.1 I/O中断原理 4.2 DMA传输原理 5.传统I/O方式 5.1传统读操作 5.2传统写操作 6.零拷贝 6.1.用户态直接IO 6.2.mmapwrite …