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

Spring 感知接口 学习笔记

一、什么是感知接口?

​感知接口(Aware Interface)​​ 是 Spring 框架提供的一组接口,​​允许 Bean 主动感知(获取)Spring 容器中的某些资源或上下文信息​​,比如容器本身、Bean 名称、环境配置等。

实现这些接口后,Spring 在初始化 Bean 时会​​自动调用对应的方法​​,将相应的资源注入到 Bean 中。


二、常见感知接口一览表

接口名称注入内容说明/用途简述核心方法
BeanNameAware当前 Bean 的名称(beanName)获取该 Bean 在 Spring 容器中的名字void setBeanName(String name)
BeanFactoryAwareBeanFactory 容器实例获取 Bean 工厂,可手动获取其他 Bean(不推荐)void setBeanFactory(BeanFactory beanFactory)
ApplicationContextAwareSpring 应用上下文(ApplicationContext)功能强大,可获取容器中的 Bean、发布事件等void setApplicationContext(ApplicationContext ctx)
EnvironmentAwareEnvironment 对象用于访问配置属性(如 application.yml 中的值)void setEnvironment(Environment env)
ResourceLoaderAwareResourceLoader 资源加载器用于加载各种资源(类路径、文件系统等)void setResourceLoader(ResourceLoader loader)
ServletContextAwareServletContext(仅 Web)在 Web 环境下获取 Servlet 上下文对象void setServletContext(ServletContext sc)

三、典型使用示例

1. ​​ApplicationContextAware 示例:获取 Spring 上下文​

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component
public class MyContextBean implements ApplicationContextAware {private ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {this.context = applicationContext;// 示例:通过名称获取某个 Bean// SomeService service = context.getBean(SomeService.class);}public void showBeanNames() {String[] beanNames = context.getBeanDefinitionNames();for (String name : beanNames) {System.out.println("Bean名称:" + name);}}
}

2. ​​BeanNameAware 示例:获取当前 Bean 的名称​

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;@Component
public class MyBeanNameBean implements BeanNameAware {@Overridepublic void setBeanName(String name) {System.out.println("当前 Bean 的名称是: " + name);}
}

3. ​​EnvironmentAware 示例:获取配置属性​

import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;@Component
public class MyEnvBean implements EnvironmentAware {private Environment env;@Overridepublic void setEnvironment(Environment environment) {this.env = environment;// 读取配置,比如 application.yml 中的配置项String value = env.getProperty("app.name");System.out.println("app.name = " + value);}
}

四、使用感知接口的注意事项 ⚠️

注意事项说明
✅ 自动调用你无需手动调用 setXxx() 方法,Spring 容器会在 Bean 初始化阶段自动调用
⚠️ 谨慎使用感知接口会让 Bean 与 Spring 框架耦合,​​过度使用会影响代码的可测试性与灵活性​
✅ 推荐替代方案大多数情况下,应该优先使用 ​​依赖注入(@Autowired)​​ 来获取 Bean 或配置,而不是通过感知接口主动获取
🧠 适用场景感知接口通常用在​​框架开发、工具类、高级功能集成​​等需要主动操作 Spring 容器的场景

五、小结 / 记忆口诀 🧠

​"Bean 名字工厂上下文,环境资源 Servlet 要记真"​

对应:

  • ​BeanNameAware​​ → Bean 名称
  • ​BeanFactoryAware​​ → Bean 工厂
  • ​ApplicationContextAware​​ → 应用上下文(最常用)
  • ​EnvironmentAware​​ → 环境配置
  • ​ResourceLoaderAware​​ → 资源加载
  • ​ServletContextAware​​ → Web 容器上下文(Servlet 相关)

六、扩展思考

  • 感知接口是 Spring ​​控制反转(IoC)与依赖注入(DI)机制的一部分​​,体现了 Spring “约定优于配置” 和 “主动感知” 的设计理念。
  • 如果你正在编写一个 ​​自定义的 Spring Starter、Bean 后置处理器、或者 AOP 切面工具类​​,很可能需要使用这些接口来与 Spring 容器交互。

✅ 推荐做法

场景推荐方式
想获取某个 Bean使用 @Autowired 注入
想读取配置(如 yaml/properties)使用 @Value 或注入 Environment
想获取 Spring 上下文尽量避免,如必须使用,可考虑 ApplicationContextAware
普通业务 Bean​不建议实现 Aware 接口​​,保持代码解耦和可测试性


文章转载自:

http://89nPqk2o.gxfpk.cn
http://TKyO9JjM.gxfpk.cn
http://CqGCoD7d.gxfpk.cn
http://d96HY1cz.gxfpk.cn
http://F36sYEmQ.gxfpk.cn
http://jkjnarmL.gxfpk.cn
http://aJKTKsWY.gxfpk.cn
http://cMGoQYEX.gxfpk.cn
http://HcHVIpx1.gxfpk.cn
http://7hvqKjqC.gxfpk.cn
http://T747x87w.gxfpk.cn
http://AKK3mqvh.gxfpk.cn
http://NQb0pwf8.gxfpk.cn
http://NTXDFDVm.gxfpk.cn
http://lb212tCO.gxfpk.cn
http://KeITAk3J.gxfpk.cn
http://0RVssC3e.gxfpk.cn
http://9BiMdy9A.gxfpk.cn
http://4WxIeocI.gxfpk.cn
http://mSTjODdB.gxfpk.cn
http://ff9X4E2U.gxfpk.cn
http://StavbEn0.gxfpk.cn
http://NgVrADSi.gxfpk.cn
http://gnqWZoEa.gxfpk.cn
http://X0mOxHhP.gxfpk.cn
http://hsm0xpVj.gxfpk.cn
http://I6bmBAVZ.gxfpk.cn
http://uQkeG9Rs.gxfpk.cn
http://hoTHXvMg.gxfpk.cn
http://hvHSk0kI.gxfpk.cn
http://www.dtcms.com/a/388208.html

相关文章:

  • AI重构服务未来:呼叫中心软件的智能跃迁之路
  • 从食材识别到健康闭环:智能冰箱重构家庭膳食管理
  • Eureka:服务注册中心
  • AI大模型如何重构企业财务管理?
  • 深入浅出Disruptor:高性能并发框架的设计与实践
  • Java 在 Excel 中查找并高亮数据:详细教程
  • Excel处理控件Aspose.Cells教程:如何将Excel区域转换为Python列表
  • Java 实现 Excel 与 TXT 文本高效互转
  • 【vue+exceljs+file-saver】纯前端:下载excel和上传解析excel
  • 国产化Excel开发组件Spire.XLS教程:使用 Python 设置 Excel 格式,从基础到专业应用
  • Parasoft以高标准测试助力AEW提升汽车软件质量
  • el-date-picker时间选择器限制时间跨度为3天
  • 35.Socket网络编程(UDP)(下)
  • 【前沿技术Trip Three】正则表达式
  • 多平台数据交换解耦方案选型
  • ​​[硬件电路-239]:从电阻器的高频等效模型,看高频信号的敏感性,电路的性能受到频率的影响较大
  • Java 中的 23 种设计模式详解
  • 《2025年AI产业发展十大趋势报告》六十二
  • 【字节跳动】LLM大模型算法面试题:大模型 LLM的架构介绍?
  • 【C++】类成员访问控制
  • 彩笔运维勇闯机器学习--梯度下降法
  • 正点原子zynq_FPGA学习笔记-vivado安装
  • 基于yolov8/yolo11的视觉识别算法使用和详解
  • 2025年数据科学与大数据技术和统计学有什么区别?
  • STM32H743-ARM例程2-GPIO点亮LED
  • 每天五分钟深度学习:深层神经网络的前向传播算法和反向传播算法
  • 【LeetCode】41. 缺失的第一个正数
  • Linux系统指令之 —— ip route route
  • 嵌入式硬件笔记:三种滤波电路的对比
  • webrtc弱网-InterArrivalDelta类源码分析与算法原理