Spring高级篇-Spring IOC容器 Aware 接口

news/2025/2/25 9:36:59

一、概述

在Spring框架中,IOC(Inversion of Control)容器负责管理应用程序中的对象(即Bean)的生命周期和依赖关系。Spring提供了一系列的Aware接口,允许Bean在初始化时获取Spring容器中的某些资源或信息。这些接口通常以Aware结尾,表示Bean能够“感知”到某些特定的Spring容器功能。

spring_Aware_3">1.2 spring 对Aware对实现

spring将Aware 分成两大类,一类是可以直接继承实现分别为 bean、classLoader、beanFactory。另一类是通过 ApplicationContextAwareProcessor 后置处理器,间接回调。
在bean注册的时候,将实现继承这些接口( bean、classLoader、beanFactory)的类相关的信息注入该类中。如下图:
在这里插入图片描述
通过 ApplicationContextAwareProcessor 后置处理器:
在这里插入图片描述

二、常用的Aware

接下来我们来看看Spring提供的常用Aware 接口。

2.1 BeanNameAware

在这里插入图片描述
实现 BeanNameAware 接口需要实现 setBeanName () 方法,这个方法只是简单的返回我们当前的 beanName,这个接口表面上的作用就是让实现这个接口的 bean 知道自己在 spring 容器里的名字,而且官方的意思是这个接口更多的使用在 spring 的框架代码中,实际开发环境应该不建议使用,因为 spring 认为 bean 的名字与 bean 的联系并不是很深,(的确,抛开 spring API 而言,我们如果获取了该 bean 的名字,其实意义不是很大,我们没有获取该 bean 的 class,只有该 bean 的名字,我们也无从下手,相反,因为 bean 的名称在 spring 容器中可能是该 bean 的唯一标识,也就是说再 beanDefinitionMap 中,key 值就是这个 name,spring 可以根据这个 key 值获取该 bean 的所有特性)所以 spring 说这个不是非必要的依赖。

2.2 BeanClassLoaderAware

2.2.1 介绍

在这里插入图片描述
BeanClassLoaderAware 接口为开发者提供了一种简单而有用的方式来获取 Bean 的类加载器信息。通过实现该接口,Bean 可以在初始化阶段获取自身类加载器,从而更灵活地处理一些与类加载器相关的逻辑。

2.3 BeanFactoryAware

2.3.1 简介

在这里插入图片描述
BeanFactoryAware 接口是一个回调接口,它提供了一个用于设置 Bean 工厂的方法。当一个 Bean 实现了 BeanFactoryAware 接口时,在该 Bean 实例被实例化后,Spring 容器会调用 setBeanFactory 方法,并将该 Bean 所在的工厂作为参数传递进去。

2.3.2 使用场景

BeanFactoryAware 最常用的场景 是在需要根据特别变量创建或者配置Bean,在运行过程中获取对应相关连的bean做一些拓展或者实现策略模式等。
BeanFactoryAware主要解决代码间的耦合问题,并且可以利用容器上下文范围其他的bean,以便实现更多的功能。

2.4 EnvironmentAware

2.4.1 介绍

在这里插入图片描述
所有注册到 Spring 容器内的 bean,只要该 bean 实现了 EnvironmentAware 接口,并且进行重写了 setEnvironment 方法的情况下,那么在工程启动时就可以获取得 application.properties 的配置文件配置的属性值,这样就不用我们将魔法值写到代码里面了。

2.5 EmbeddedValueResolverAware

在这里插入图片描述
EmbeddedValueResolverAware 接口为开发者提供了一种获取EmbeddedValueResolver对象的机会,该对象可用于解析占位符表达式。通过实现该接口,Bean 可以在初始化阶段获取解析占位符的能力,从而更灵活地处理一些与动态属性值相关的逻辑。

2.6 ResourceLoaderAware

在这里插入图片描述
ResourceLoaderAware 是特殊的标记接口,它希望拥有一个 ResourceLoader 引用的对象。当实现了 ResourceLoaderAware 接口的类部署到 application context (比如受 Spring 管理的 bean) 中时,它会被 application context 识别为 ResourceLoaderAware。 接着 application context 会调用 setResourceLoader (ResourceLoader) 方法,并把自身作为参数传入该方法 (记住,所有 Spring 里的 application context 都实现了 ResourceLoader 接口)。

既然 ApplicationContext 就是 ResourceLoader,那么该 bean 就可以实现 ApplicationContextAware 接口并直接使用所提供的 application context 来载入资源,但是通常更适合使用特定的满足所有需要的 ResourceLoader 实现。 这样一来,代码只需要依赖于可以看作辅助接口的资源载入接口,而不用依赖于整个 Spring ApplicationContext 接口。

2.7 ApplicationEventPublisherAware

在这里插入图片描述
ApplicationEventPublisherAware 接口是一个回调接口,它提供了一个用于设置 Bean 所在的ApplicationEventPublisher 的方法。当一个 Bean 实现了 ApplicationEventPublisherAware 接口时,在该 Bean 实例被实例化后,Spring 容器会调用 setApplicationEventPublisher 方法,并将该 Bean 所在的ApplicationEventPublisher 作为参数传递进去。主要用于获取发布事件的 ApplicationEventPublisher,使得 Bean 能够在运行时发布自定义的事件。

2.8 MessageSourceAware

在这里插入图片描述
MessageSourceAware 接口是 Spring 提供的一个用于访问消息资源(例如文本消息)的接口。国际化的主要目标是使应用程序的用户界面能够根据用户的首选语言或地区显示相应的消息。

2.9 ApplicationContextAware

在这里插入图片描述
ApplicationContextAware 的作用是可以方便获取 Spring 容器 ApplicationContext,从而可以获取容器内的 Bean。ApplicationContextAware 接口只有一个方法,如果实现了这个方法,那么 Spring 创建这个实现类的时候就会自动执行这个方法,把 ApplicationContext 注入到这个类中,也就是说,spring 在启动的时候就需要实例化这个 class(如果是懒加载就是你需要用到的时候实例化),在实例化这个 class 的时候,发现它包含这个 ApplicationContextAware 接口的话,sping 就会调用这个对象的 setApplicationContext 方法,把 applicationContext Set 进去了。


http://www.niftyadmin.cn/n/5865328.html

相关文章

Starlink卫星动力学系统仿真建模第十讲-基于SMC和四元数的卫星姿态控制示例及Python实现

基于四元数与滑模控制的卫星姿态控制 一、基本原理 1. 四元数姿态表示 四元数运动学方程: 3. 滑模控制设计 二、代码实现(Python) 1. 四元数运算工具 import numpy as npdef quat_mult(q1, q2):"""四元数乘法""…

实现实时数据仓库开源项目

根据你的需求,以下是一些可以实现类似 ClickHouse 的实时数仓功能的项目,这些项目提供了高性能的数据处理和分析能力,适合实时数据仓库的场景: 1. Apache Doris Apache Doris 是一个开源的实时数据仓库,支持高吞吐量…

模版语法vscode

这里注意&#xff1a;<template></template>里面只能写一个根标签&#xff0c;其他在嵌套&#xff1a; <script > export default {data(){return{tthtml:"<a hrefhttps://itbaizhan.com>百战程序员</a>"}} } </script><tem…

Spark ,虚拟机(Linux)基本命令(2)

cp 命令&#xff0c;复制 格式&#xff1a;cp 源文件 目标文件 cp -r 命令 复制目录 格式&#xff1a;cp -r 源文件 目标文件夹 mv 命令&#xff0c;重命名和移动 格式&#xff1a;mv 源文件 目标文件 说明&#xff1a;若源文件和目标文件在同一个目录下&#xff0c;就是重…

本地开发用ASP.NET Core Web API项目创建及测试

1. 服务端代码&#xff08;C#&#xff09; 1.1 创建ASP.NET Core Web API项目 打开Visual Studio 2022。 选择“创建新项目”。 选择“ASP.NET Core Web API”模板&#xff0c;点击“下一步”。 输入项目名称&#xff08;如OracleApi&#xff09;&#xff0c;选择项目位置&…

AI赋能游戏前端:效率革命与沉浸式体验的未来

游戏行业正经历一场深刻的变革&#xff0c;玩家对游戏体验的要求越来越高&#xff0c;追求更逼真、更沉浸式的游戏世界。为了满足玩家日益增长的需求&#xff0c;游戏开发者们需要不断提升开发效率和品质。而AI写代码工具的出现&#xff0c;正为游戏前端开发带来一场效率革命&a…

stm32-电源控制

STM32 的 PWR&#xff08;Power Control&#xff09;外设 是用于管理微控制器电源模式和外设电源控制的模块。通过 PWR 外设&#xff0c;可以实现低功耗模式、电压调节、备份域控制等功能&#xff0c;从而优化系统的功耗和性能。 stm32内部电源框图 电源区域 VDD 供电区&#x…

【UDS】s19文件解析

s19文件解析 1. 什么是 S192. S19 格式2.1 s19 记录类型定义2.2 CRC校验3. S19 解析举例4. S19 解析在项目中的运用1. 什么是 S19 S19(S-Record) 文件是一种广泛应用于嵌入式系统开发中的文件格式,摩托罗拉于1970s发明,主要用于存储程序的可执行代码和相关数据。它以文本格…