当前位置: 首页 > news >正文

Spring Boot 中的 Aware 接口以及 ApplicationContextAware 的详细说明、使用示例及注意事项

以下是关于 Spring Boot 中的 Aware 接口以及 ApplicationContextAware 的详细说明、使用示例及注意事项


一、Aware 接口简介

Spring 框架提供了一系列 Aware 接口,用于让 Bean 在初始化时感知并获取 Spring 容器中的特定组件。这些接口通过回调方法,将容器或相关对象注入到 Bean 中,使其能够与容器交互。

常见 Aware 接口

接口名称功能描述回调方法
BeanNameAware获取当前 Bean 的名称setBeanName(String name)
BeanFactoryAware获取 BeanFactory 实例setBeanFactory(BeanFactory)
ApplicationContextAware获取 ApplicationContext 实例setApplicationContext()
ApplicationEventPublisherAware发布事件setApplicationEventPublisher()

二、ApplicationContextAware 的作用

ApplicationContextAware 是最常用的 Aware 接口之一,允许 Bean 直接获取 Spring 应用上下文(ApplicationContext。通过它,可以:

  • 动态获取容器中的其他 Bean。
  • 访问资源(如 messageSourceenvironment 等)。
  • 发布或监听应用事件。

三、使用步骤与示例

1. 实现 ApplicationContextAware
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component  // 将 Bean 注入 Spring 容器
public class MyApplicationContext implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {applicationContext = context; // 保存 ApplicationContext 引用}// 提供静态方法获取 Beanpublic static <T> T getBean(Class<T> beanClass) {return applicationContext.getBean(beanClass);}public static Object getBean(String beanName) {return applicationContext.getBean(beanName);}
}
2. 在其他 Bean 中使用
@Service
public class MyService {public void doSomething() {// 通过静态方法获取其他 BeanAnotherService anotherService = MyApplicationContext.getBean(AnotherService.class);anotherService.someMethod();}
}
3. 访问资源或环境变量
// 获取环境变量
Environment env = MyApplicationContext.getApplicationContext().getEnvironment();
String property = env.getProperty("my.config.key");// 获取消息资源
MessageSource messageSource = MyApplicationContext.getApplicationContext().getBean(MessageSource.class);
String message = messageSource.getMessage("key", null, Locale.getDefault());

四、关键特性

  1. 回调时机

    • setApplicationContext() 方法在 Bean 初始化阶段调用,早于 @PostConstruct
  2. 线程安全

    • ApplicationContext 是单例且线程安全的,但需确保静态引用的线程安全。
  3. 适用场景

    • 需要动态获取未在依赖注入中声明的 Bean
    • 需要直接访问容器的资源(如 EnvironmentMessageSource)。

五、注意事项

1. 避免过度使用
  • 反模式:通过 ApplicationContext 随意获取 Bean 可能破坏依赖注入的封装性,导致代码耦合度增加。
  • 推荐:优先使用 依赖注入(@Autowired),仅在必要时(如动态获取 Bean)使用 ApplicationContext
2. 单例与作用域
  • ApplicationContext 是单例的,但获取的 Bean 可能是原型(Prototype)作用域,需注意线程安全问题。
3. 测试时的局限性
  • 在单元测试中,需确保 ApplicationContext 已正确初始化(如使用 @SpringBootTest)。

六、替代方案

1. 依赖注入
@Service
public class MyService {@Autowiredprivate AnotherService anotherService; // 直接注入
}
2. 使用 @Resource@Inject
@Service
public class MyService {@Resource(name = "anotherService")private AnotherService anotherService;
}

七、总结表格

接口用途典型场景
ApplicationContextAware获取全局容器,动态访问 Bean需要访问未注入的 Bean 或容器资源
BeanNameAware获取当前 Bean 的名称需要记录或使用 Bean 名称
BeanFactoryAware获取 BeanFactory 实例需要自定义 Bean 创建逻辑(如工厂模式)
ApplicationEventPublisherAware发布应用事件实现事件驱动的解耦通信

八、使用场景示例

场景 1:动态获取 Bean
@Component
public class DynamicBeanFetcher {public void doWork() {// 动态获取配置的 BeanString beanName = "dynamicBean";Object bean = MyApplicationContext.getBean(beanName);if (bean != null) {// 执行操作}}
}
场景 2:访问配置属性
@Component
public class ConfigAccessor {public String getConfigValue() {Environment env = MyApplicationContext.getApplicationContext().getEnvironment();return env.getProperty("app.config.key");}
}

九、替代方案对比

方案优点缺点
依赖注入(@Autowired)解耦、类型安全、易于测试需预先声明依赖
ApplicationContextAware动态获取 Bean,灵活访问容器资源破坏封装性,增加耦合度
@Resource支持名称和类型注入需要 Bean 存在

通过以上分析,可以明确 ApplicationContextAware 的使用场景、实现方式及潜在风险,合理选择是否采用该接口以满足项目需求。

相关文章:

Spring Boot 中的 Aware 接口以及 ApplicationContextAware 的详细说明、使用示例及注意事项

以下是关于 Spring Boot 中的 Aware 接口以及 ApplicationContextAware 的详细说明、使用示例及注意事项&#xff1a; 一、Aware 接口简介 Spring 框架提供了一系列 Aware 接口&#xff0c;用于让 Bean 在初始化时感知并获取 Spring 容器中的特定组件。这些接口通过回调方法&a…...

nginx的自定义日志

正常nginx的报错都会在 想要把日志独立出来需要用到俩个参数 然后创建目录 mkdir /var/log/timingxu.org 最后实验一下 结果实验成功...

【蓝桥杯速成】| 17.完全背包(一维easy版)

题目一&#xff1a;爬楼梯 问题描述 57. 爬楼梯&#xff08;第八期模拟笔试&#xff09; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整…...

算法导论(动态规划)——路径问题

算法思路&#xff08;62&#xff09; 状态表示&#xff1a; 在解决“路径类”问题时&#xff0c;常见的状态表示形式有两种&#xff1a; 形式一&#xff1a;从位置 [i,j] 出发的路径计数。形式二&#xff1a;从起始位置到达位置 [i,j] 的路径计数。 本文选择第二种形式来定义状…...

Python Flask并发demo(http并发与锁)独占接口、monkey功能还不太确定

文章目录 Flask 并发接口实现示例代码示例关键并发支持特性解析1. **Gevent monkey patching**&#xff1a;2. **线程锁控制**&#xff1a;3. **协程服务器**&#xff1a;4. **状态标志与异常处理**&#xff1a;5. **接口差异化处理**&#xff1a; 使用场景- 需要处理高并发请求…...

stm32第十天外部中断和NVIC讲解

一&#xff1a;外部中断基础知识 1.STM32外部中断框架 中断的概念&#xff1a;在主程序运行过程中&#xff0c;出现了特点的中断触发条件&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 1&…...

音视频 ColorSpace色彩空间详解

前言 基于前篇介绍YUV格式,本文继续介绍另一个重要概念颜色空间,又叫色彩空间;主要用于在音视频开发中的色彩空间转换。 色彩空间Color Space 色彩空间由色彩模型和色域共同定义。当色彩模型与特定的描述相关联以后,就称为色彩空间。 色彩模型Color Model 色彩模型Col…...

通义万相2.1 你的视频创作之路

通义万相2.1的全面介绍 一、核心功能与技术特点 通义万相2.1是阿里巴巴达摩院研发的多模态生成式AI模型&#xff0c;以视频生成为核心&#xff0c;同时支持图像、3D内容及中英文文字特效生成。其核心能力包括&#xff1a; 复杂动作与物理规律建模 能够稳定生成包含人体旋转、…...

动态规划学习——背包问题

一&#xff0c;开心的金明 题目链接&#xff1a;P1060 [NOIP 2006 普及组] 开心的金明 - 洛谷 本题是一道经典的01背包问题&#xff0c;状态表示和状态定义可以仿照01背包的来。 01背包传送门&#xff1a;【背包问题 】01背包_01背包算法题链接-CSDN博客 dp[i][j]表示从前i个物…...

oracle数据泵操作

源库操作 查询目录对象是否已定义 plsql执行 select * from dba_directories t where t.directory_name MYDIR;先创建一个d盘databack文件夹上边语句查询,无返回数据&#xff0c;则创建&#xff0c;若提示权限不足&#xff0c;请授权 plsql执行 create directory mydir as …...

flutter框架中文文档,android智能手机编程答案

RecyclerView优化全攻略&#xff1a;从数据处理到性能提升 字节跳动四面有三面都问了这个问题&#xff0c;在此做了整理&#xff0c;希望可以帮助到大家&#xff0c;欢迎查漏补缺。 数据处理和视图加载分离 我们知道&#xff0c;从远端拉取数据肯定是要放在异步的&#xff0…...

Sourcetree安装教程及配合Gitee的使用

零、SourceTree介绍 SourceTree 是一款由 Atlassian 公司开发的免费图形化版本控制工具&#xff0c;支持 Git 和 Mercurial 两大版本控制系统。它通过直观的界面简化了代码管理操作&#xff0c;适合开发者和团队高效管理项目代码。 核心功能 可视化操作 无需记忆命令行&#x…...

.net farmework 4.8 类库中添加 wpf 窗体

一般正常情况下&#xff0c;在 .net farmework 4.8 类库中是无法添加 wpf 窗体的&#xff0c;如下图 但是可以添加 winform 窗体&#xff0c;如果想添加 wpf 窗体&#xff0c;需要一些更改 1.添加库 在程序集这里添加库&#xff0c;直接搜索名字即可 需要添加下面库&#xff1…...

某合约任意提取BNB漏洞

1背景描述 合约是一个在满足特定条件时在区块链上执行代码的程序&#xff0c;各方以数字签署合同的方式准许并维护它的其运行。这些代码可以是向朋友汇款、买卖 NFT 虚拟商品等一系列复杂的内容。 存在漏洞的目标合约是一个结合Meme文化病毒式传播与去中心化金融&#xff08;D…...

Python+新版DeepSeek V3轻松开发Agent

1 简介 前几天新版DeepSeek V3模型&#xff08;代号250324&#xff09;更新发布。作为支持函数调用的先进开源大模型&#xff0c;我们可以基于它进行高效的Agent功能开发&#xff0c;这也是当下非常火热&#x1f525;的AI应用领域。 今天的文章中&#xff0c;我就将带大家以P…...

Linux内核网络栈:数据发送流程解析

引言 在Linux内核网络栈中,数据的发送过程涉及到多个层次的协作,从应用层的系统调用,到传输层协议的实现,再到网络层和链路层的处理,最终通过网络设备将数据包发送出去。这一过程需要多个关键结构体和回调函数的参与,包括struct proto、struct proto_ops和struct net_de…...

[leetcode]2492. 两个城市间路径的最小分数(并查集 排序后建边)

题目链接 题意 给定一个 n n n个点 m m m条边的无向图 每条边有边权 求1-n的路径中最小的边权是多少 每条路可以重复走 思路 把边按边权降序排序 用并查集维护连通性 遍历每条边 每次合并边的起点和终点 如果1和n联通 并且这条边在1和n的这个连通块中 就对ans取min Code…...

git 常用操作整理

一.git 的概念 Git 是一个分布式版本控制系统&#xff0c;用于跟踪文件的更改历史&#xff0c;帮助开发者管理代码的版本。以下是关于 Git 的一些基本概念&#xff1a; 1. 仓库&#xff08;Repository&#xff09; - **本地仓库**&#xff1a;在你的计算机上存储的项目文件及…...

AWS API Gateway Canary部署实战:Lambda到ECS的平滑迁移指南

在云原生架构中,如何实现服务平滑迁移是一个常见挑战。本文将详细介绍如何利用AWS API Gateway的Canary部署功能,实现从Lambda函数到ECS服务的无缝迁移,同时保证客户端无感知并提供便捷的回退机制。 一、迁移方案概述 在本方案中,我们将实现以下目标: 将现有Lambda服务平…...

MyBatisPlus不等于如何使用

在 MyBatis Plus 中&#xff0c;ne 方法用于构建不等于条件的 SQL 查询。以下是 ne 方法的详细用法&#xff1a; 基本用法 ne 方法可以用于 QueryWrapper 或 LambdaQueryWrapper 中&#xff0c;用于指定某个字段的值不等于指定的值。它对应于 SQL 中的 ! 或 <> 操作符。 …...

Java面试黄金宝典25

1. 对 100 万个玩家的积分中前 100 名积分进行实时更新 定义 该问题旨在实时追踪并展示 100 万个玩家中积分排名前 100 的玩家信息。随着玩家通过完成任务或获取金钱改变积分&#xff0c;系统需要迅速更新排名并展示最新的前 100 名。 要点 运用 Java 的 PriorityQueue 构建…...

洛谷题单1-P5708 【深基2.习2】三角形面积-python-流程图重构

题目描述 一个三角形的三边长分别是 a a a、 b b b、 c c c&#xff0c;那么它的面积为 p ( p − a ) ( p − b ) ( p − c ) \sqrt{p(p-a)(p-b)(p-c)} p(p−a)(p−b)(p−c) ​&#xff0c;其中 p 1 2 ( a b c ) p\frac{1}{2}(abc) p21​(abc)。输入这三个数字&#xff…...

深入理解指针5

sizeof和strlen的对比 sizeof的功能 **sizeof是**** 操作符****&#xff0c;用来**** 计算****变量或类型或数组所占**** 内存空间大小****&#xff0c;**** 单位是字节&#xff0c;****他不管内存里是什么数据** int main() {printf("%zd\n", sizeof(char));p…...

常见集合篇(一):算法复杂度分析,从理论到业务场景的深度解析

常见集合篇&#xff1a;算法复杂度分析&#xff0c;从理论到业务场景的深度解析 常见集合篇&#xff08;一)&#xff1a;算法复杂度分析&#xff0c;从理论到业务场景的深度解析一、为什么要进行复杂度分析&#xff08;一&#xff09;事后统计法的局限性&#xff08;二&#xf…...

SpringCould微服务架构之Docker(9)

Docker的基本操作之数据卷 容器跟数据耦合的问题&#xff1a; 1、不便于修改&#xff1a;当我们要修改Nginx的html内容时&#xff0c;需要进入容器内部修改&#xff0c;很不方便。 2、数据不可复用&#xff1a;在容器内部 的修改对外是不可见的&#xff0c;所有的修改对新创…...

探索 Gaggol:理解 10^^^100 的宇宙级常数

一、常数概述&#xff1a; Gaggol 是一个极其巨大的数学常数&#xff0c;其数值表示为 10^^^100。这个常数是通过对数字 10 进行超递归幂运算得到的结果。 二、Gaggol 的定义&#xff1a; Gaggol 被定义为 10 的超多层超递归幂&#xff0c;即 10 被连续地提升到自身幂的层次达…...

【C++】STL库_stack_queue 的模拟实现

栈&#xff08;Stack&#xff09;、队列&#xff08;Queue&#xff09;是C STL中的经典容器适配器 容器适配器特性 不是独立容器&#xff0c;依赖底层容器&#xff08;deque/vector/list&#xff09;通过限制基础容器接口实现特定访问模式不支持迭代器操作&#xff08;无法遍历…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例13,TableView16_13 键盘辅助拖拽示例

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例13,TableView16_13 键…...

Python的概论

免责声明 如有异议请在评论区友好交流&#xff0c;或者私信 内容纯属个人见解&#xff0c;仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示&#xff1a;&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c…...

AI 数字人短视频数字人口播源码:短视频内容生产的新引擎​

在当下信息爆炸的时代&#xff0c;短视频已成为主流的信息传播与娱乐方式之一。在如此庞大的市场需求下&#xff0c;如何高效、创新地生产短视频内容成为了行业关注的焦点。AI 数字人短视频数字人口播源码应运而生&#xff0c;为短视频内容生产带来了全新的变革。​ 一、行业背…...

数字人训练数据修正解释

数字人训练数据修正和查看 不需要GPU也能运行的DH_live-案例 : I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To t…...

VRRP虚拟路由器冗余协议

一、VRRP介绍 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议&#xff09;是一种用于提高网络可靠性的协议&#xff0c;旨在通过冗余机制解决默认网关单点故障问题。 核心思想&#xff1a;将多个物理路由器虚拟成一个逻辑路由器&#xf…...

微前端 - 以无界为例

一、微前端核心概念 微前端是一种将单体前端应用拆分为多个独立子应用的架构模式&#xff0c;每个子应用可独立开发、部署和运行&#xff0c;具备以下特点&#xff1a; 技术栈无关性&#xff1a;允许主应用和子应用使用不同框架&#xff08;如 React Vue&#xff09;。独立部…...

Python与图像处理

目录 一、认识图像 1、图像的构成 2、图像模式 二、处理图像 1、图像缩放 2、图像的旋转和翻转 3、滤镜效果 4、图片剪裁 5、图片素描 6、图片加水印 在众多的Python的第三方的库中&#xff0c;Pillow库是一个强大且方便的库&#xff0c;它能够处理图像&#xff0c;比…...

Lua语言脚本环境配置

参考地址&#xff1a;Lua 教程 | 菜鸟教程 Windows等直接下载安装地址&#xff1a;Lua Binaries 上面也是会跳转下载&#xff1a;https://sourceforge.net/projects/luabinaries/ 下载解压后在“环境变量”中添加路径&#xff0c;添加后如果cmd中还是无法使用lua命令&#x…...

JavaScript的异步编程

目录 目标 实战 回调函数 (Callback) Promise 目标 了解异步编程实现方式。 实战 回调函数 (Callback) 当某个任务完成后&#xff0c;调用回调函数来处理结果。它通常会导致回调地狱&#xff0c;即嵌套多个回调函数&#xff0c;官方不推荐使用。 function fetchData(call…...

Ubuntu里安装Jenkins

【方式1】&#xff1a;下载war包&#xff0c;直接运行&#xff0c;需提前搭建Java环境&#xff0c;要求11或17&#xff0c;不推荐&#xff0c;war包下载地址&#xff0c;将war包上传到服务器&#xff0c;直接使用命令启动 java -jar /data/jenkins/jenkins.war【方式2】&#…...

qt介绍tcp通信

服务器端代码 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);setWindowTitle("服务器");ui->port->setText("…...

elementui的默认样式修改

今天用element ui &#xff0c;做了个消息提示&#xff0c;发现提示的位置总是在上面&#xff0c;如图&#xff1a; 可是我想让提示的位置到下面来&#xff0c;该怎么办&#xff1f; 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码 效…...

【Windows】win10系统安装.NET Framework 3.5(包括.NET 2.0和3.0)失败 错误代码:0×80240438

一、.NET3.5(包括.NET 2.0和3.0)安装方式 1.1 联网安装(需要联网,能访问微软,简单,很可能会失败) 1.2 离线安装-救急用(需要操作系统iso镜像文件,复杂,成功几率大) 二、联网安装 通过【控制面板】→【程序】→【程序和功能】→【启用或关闭Windows功能】 下载过程…...

leetcode 53.Maximum Subarray

分治法 //lSum表示[left,right]内以left为左端点的最大子段和 //rSum表示[left,right]内以right为右端点的最大字段和 //iSum表示[left,right]的区间和 int divide_conquer(int* nums,int left,int right,int *lSum,int *rSum,int *iSum){int maxSum;//表示[left,right]内的最…...

手机零售行业的 AI 破局与创新降本实践 | OceanBase DB大咖说

OceanBase《DB 大咖说》第 20 期&#xff0c;我们邀请了九机与九讯云的技术总负责人&#xff0c;李远军&#xff0c;为我们分享手机零售企业如何借力分布式数据库OceanBase&#xff0c;赋能 AI 场景&#xff0c;并通过简化架构实现成本管控上的突破与创新。 李远军于2016年加入…...

基于MCU实现的电机转速精确控制方案:软件设计与实现

本文将详细介绍一篇基于微控制器&#xff08;MCU&#xff09;的电机转速精确控制的软件方案。通过采样PWM信号控制和ADC采样技术&#xff0c;结合PID闭环控制算法&#xff0c;实现了电机转速的高效、稳定调节。以下是软件方案流程图&#xff0c;下文将对其进行展开讲解。 原图太…...

【力扣hot100题】(026)合并两个有序链表

可以创建一个新链表记录答案&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *…...

从代码学习深度学习 - 使用块的网络(VGG)PyTorch版

文章目录 前言一、VGG网络简介1.1 VGG的核心特点1.2 VGG的典型结构1.3 优点与局限性1.4 本文的实现目标二、搭建VGG网络2.1 数据准备2.2 定义VGG块2.3 构建VGG网络2.4 辅助工具2.4.1 计时器和累加器2.4.2 准确率计算2.4.3 可视化工具2.5 训练模型2.6 运行实验总结前言 深度学习…...

程序化广告行业(46/89):竞价结算规则、底价策略与内部排名解析

程序化广告行业&#xff08;46/89&#xff09;&#xff1a;竞价结算规则、底价策略与内部排名解析 大家好&#xff01;在之前的几篇博客中&#xff0c;我们已经深入探讨了程序化广告的多个重要方面&#xff0c;从基础概念到实际操作流程。我写这些博客的目的&#xff0c;就是希…...

C/C++ 基础 - 回调函数

目录 前言 回调函数预备知识 函数指针 什么是函数指针 函数指针的语法 如何用函数指针调用函数 函数指针作为函数的参数 函数指针作为函数返回类型 函数指针数组 回调函数 什么是回调函数 为什么要用回调函数 怎么使用回调函数 总结 前言 在写项目的时候&#x…...

【Node.js入门笔记12---npm包】

Node.js入门笔记12 Node.js---npm包一、什么是npm包&#xff1f;二、npm 基础使用三、包管理配置文件&#xff08;package.json&#xff09;四、提升下载速度 五、包的分类 Node.js—npm包 一、什么是npm包&#xff1f; 定义 npm&#xff08;全称 Node Package Manager&#x…...

黑盒测试的正交实验法

背景: 利用因果图法、判定表法可以帮助我们对于输入数据的组合情况进行用例设计&#xff0c;但当输入数据的组合数量巨大时&#xff0c;由于不太可能覆盖到每个输入组合的测试情况&#xff0c;因果图法或判定表法可能就不太适用了&#xff0c;可以采用正交实验法、来合理地减少…...

链表算法的技巧和方法

常用技巧&#xff1a; 1、画图 2、引入虚拟的头节点 3、不要害怕浪费空间&#xff0c;要勇于定义变量&#xff0c;eg:当链表的插入和删除的时候&#xff0c;为了便于结构体指针的连续性&#xff0c;就需要定义一个新的结构体指针&#xff0c;能更加方便&#xff1b; 4、使用快慢…...