BeanFactoryAware 机制简介

BeanFactoryAware 是 Spring 框架中的一个接口,它允许一个 bean 在其初始化时感知到其所在的 BeanFactory。这通常用于在 bean 内部进行一些高级配置或访问 Spring 容器中的其他 bean。

简单使用

当你实现 BeanFactoryAware 接口时,你需要实现 setBeanFactory(BeanFactory beanFactory) 方法。Spring 容器会在 bean 的初始化过程中自动调用这个方法,并传入当前的 BeanFactory 实例。说人话就是,如果在写代码当中需要使用到当前的BeanFactory 来创建自己定义的Bean时,我们需要拿到BeanFactory对象的,我们可不可以直接在当前上下文中直接调用getBeanFactory()方法来获取呢?答案是并没有提供这么一个方法类主动获取,但是Spring提供了BeanFactoryAware 接口,让你被动获取,也就是回调给你BeanFactory对象。

/**
* 实现 BeanFactoryAware 接口,获取 Bean工厂对象。
*/
public static class XRedisRegister implements BeanFactoryAware  {private BeanFactory beanFactory; // 重新BeanFactoryAware的方法,让spring回调来注入@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;}public void myFunction(){// 可以使用 beanFactory 来做一些事情}}

实现机制

从spring源码中看aware接口在bean加载时的调用情况,BeanFactoryAware 接口很简单,只是继承了Aware来做第一重判断,在Spring通过反射获取各个Bean的时候会进行类型判断,如果是 BeanFactoryAware 的实现类则会进行BeanFactory注入。在Spring中的源码如下:

if (bean instanceof Aware) {if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}if (bean instanceof BeanClassLoaderAware) {((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());}if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}
}

补充扩展

Spring的依赖注入的最大亮点就是你所有的Bean对Spring容器的存在是没有意识的。即你可以将你的容器替换成别的容器,例如Goggle Guice,这时Bean之间的耦合度很低。

但是在实际的项目中,我们不可避免的要用到Spring容器本身的功能资源,这时候Bean必须要意识到Spring容器的存在,才能调用Spring所提供的资源,这就是所谓的Spring Aware。其实Spring Aware本来就是Spring设计用来框架内部使用的,若使用了Spring Aware,你的Bean将会和Spring框架耦合。

Spring提供的Aware接口如下表所示:

接口作用
BeanNameAware获得到容器中Bean的名称
BeanFactoryAware获得当前bean factory,这样可以调用容器的服务
ApplicationContextAware获得当前application context,这样可以调用容器的服务
MessageSourceAware获得message source这样可以获得文本信息
ApplicationEventPublisherAware应用事件发布器,可以发布事件
ResourceLoaderAware获得资源加载器,可以获得外部资源文件

Spring Aware的目的是为了让Bean获得Spring容器的服务。因为ApplicationContext接口集成了MessageSource接口,ApplicationEventPublisherAware接口和ResourceLoaderAware接口,所以Bean继承ApplicationContextAware可以获得Spring容器的所有服务,但原则上我们还是用到什么接口就实现什么接口。

参考:
https://www.cnblogs.com/duanxz/p/3724429.html
https://yiyan.baidu.com/

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

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

相关文章

每日复盘-20240702

今日关注: 20240702 六日涨幅最大: ------1--------301388--------- 欣灵电气 五日涨幅最大: ------1--------301388--------- 欣灵电气 四日涨幅最大: ------1--------301388--------- 欣灵电气 三日涨幅最大: ------1--------301388--------- 欣灵电气 二日涨幅最…

OpenSSH RCE (CVE-2024-6387) | 附poc | 小试

Ⅰ 漏洞描述 OpenSSH 远程代码执行漏洞(CVE-2024-6387)&#xff0c;该漏洞是由于OpenSSH服务器 (sshd) 中的信号处理程序竞争问题&#xff0c;未经身份验证的攻击者可以利用此漏洞在Linux系统上以root身份执行任意代码。 Ⅱ 影响范围 8.5p1 < OpenSSH < 9.8p1 但OpenSS…

Java--创建对象内存分析

1.如图所示&#xff0c;左边为一个主程序&#xff0c;拥有main方法&#xff0c;右边定义了一个Pet类&#xff0c;通过debug不难看出&#xff0c;当启动该方法时&#xff0c;有以下该步骤 1.运行左边的实例化Pet类对象 2.跳转至右边定义Pet类的语句 3.跳回至左边获取Pet类基本属…

PyInstaller exe文件报错

文章目录 包找不到的问题去掉黑窗口 包找不到的问题 遇到的问题 : 打包好了之后exe文件报错: 没有找到这个文件 1.当时打包的 有这个文件main.spec 打开它找到hiddenimports ,填上差的包 2, 删除build和dist 3,在当前命令行下执行pyinstaller main.spec打包生成exe 去掉黑…

3.js - 深度测试、深度写入、深度函数

md&#xff0c;艹&#xff0c;这玩意得理解&#xff0c;只看代码不管事 效果图 代码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } …

入门PHP就来我这(纯干货)05

~~~~ 有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 数组及创建 数组&#xff0c;顾名思义&#xff0c;本质上就是一系列数据的组合…

高薪程序员必修课-volatile如何解决并发场景下可见性和有序性的问题

目录 前言 原理 可见性 有序性 示例 示例1&#xff1a;解决可见性问题 示例2&#xff1a;解决有序性问题 总结 前言 在Java中&#xff0c;volatile 关键字用于解决并发场景下的可见性和有序性问题。通过理解 volatile 的工作原理和使用示例&#xff0c;可以更好地应用它…

如何绕过验证码:终极指南 2024

你正在上网&#xff0c;突然出现了一个验证码&#xff0c;打断了你的浏览。是的&#xff0c;这就是那个确保你不是机器人的小测试&#xff0c;面对现实吧–它真的会拖慢你的进程。好消息是什么&#xff1f;你不必被卡住。你可以绕过验证码。所以&#xff0c;系好安全带&#xf…

Studying-代码随想录训练营day26| 491.递增子序列、46.全排列、47.全排列 II、51.N皇后、37.解数独、回溯总结

第26天&#xff0c;回溯part04&#xff0c;昨天休息复习总结回溯内容&#xff0c;&#x1f4aa;(ง •_•)ง&#x1f4aa; 目录 491.递增子序列 46.全排列 47.全排列 II 51.N皇后 37.解数独 回溯总结 491.递增子序列 文档讲解&#xff1a;代码随想录递增子序列 视频讲…

[数据库原理]数据库设计(er图)

xtu期末是机试&#xff0c;所以图形表示有点不同 实体之间的关系&#xff1a; 多对多&#xff1a;可以生成一个新的关系模型一对一&#xff1a;两边都要关联一对多、多对一 &#xff1a;一的主键可以作为多的外键 如有错误&#xff0c;欢迎指正&#xff01;&#xff01;&#x…

中画幅巡检相机-SHARE 100M A10

【毫厘之间&#xff0c;洞见非凡】 ——SHARE 100M A10中画幅测量相机&#xff0c;巡检行业的新选择 在巡检行业&#xff0c;精准度是关键&#xff0c;深圳赛尔智控科技有限公司最新推出的SHARE 100M A10中画幅测量相机&#xff0c;基于先进的IMX461影像传感器&#xff0c;拥有…

Java面试题:索引创建的原则

索引创建的原则 针对数据量较大,且查询较频繁的表建立索引 (单表超过10w) 针对于常作为 查询条件(where) 排序(order by) 分组(group by) 操作的字段建立索引 尽量选择区分度高的列作为索引,尽量选择唯一索引,区分度越高,使用索引的效率越高 字符串类型字段,字段长度越…

rmvb转mp4格式有什么好方法?这四种好方法轻松帮你完成转换!

rmvb转mp4格式有什么好方法&#xff1f;当大家深入探索视频格式的多元世界时&#xff0c;不禁会被各种格式的独特魅力所吸引&#xff0c;在众多选项中&#xff0c;RMVB和MP4无疑是两大热门选择&#xff0c;它们各自在不同的场合下展现出了令人瞩目的优势与局限&#xff0c;首先…

25考研:今年初试时间比去年更早了?

过去5年考研初试时间安排如下&#xff1a; 24考研&#xff1a;2023年12月23-24日&#xff08;倒数第二个周末&#xff09; 23考研&#xff1a;2022年12月24-25日&#xff08;倒数第二个周末&#xff09; 22考研&#xff1a;2021年12月25-26日&#xff08;最后一个周末&#xf…

中英双语介绍美国的州:俄亥俄州(Ohio)

中文版 俄亥俄州简介 俄亥俄州位于美国中西部地区&#xff0c;是一个以其工业基础、文化遗产和教育资源而著称的州。以下是对俄亥俄州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 俄亥俄州北接密歇根州和伊利湖&#xff0c;东临宾…

【Linux】TCP协议【下二】{流量控制/滑动窗口/延迟应答/捎带应答/拥塞控制}

文章目录 1.流量控制--利用“窗口大小”字段协商数据量大小1. 1第一次的时候&#xff0c;怎么保证发送数据量是合理的1.2第三次握手ack的时候&#xff0c;可以携带数据&#xff01;1.3流量控制&#xff0c;属于可靠性还是属于效率&#xff1f; 2.滑动窗口--利用滑动窗口解决批量…

x264 编码器分析、预测、估计模块相关结构体介绍

分析模块相关结构体 x264_mb_analysis_t 定义:在 analyse.c 文件中定义typedef struct {/* conduct the analysis using this lamda and QP */int i_lambda;int i_lambda2;int i_qp;uint16_t *p_cost_mv;uint16_t *p_cost_ref[2</

代码随想三刷动态规划篇6

代码随想三刷动态规划篇6 139. 单词拆分题目代码 多重背包题目代码 139. 单词拆分 题目 链接 代码 class Solution {public boolean wordBreak(String s, List<String> wordDict) {boolean[] dp new boolean[s.length()1];dp[0] true;for (int i 1; i < s.leng…

快速入门FreeRTOS心得(正点原子学习版)

对于FreeROTS&#xff0c;我第一反应想到的就是通信里的TDM&#xff08;时分多址&#xff09;。不同任务给予分配不同的时间间隔&#xff0c;也就是任务之间在每个timeslot都在来回切换。 这里有重要的一点&#xff0c;就是中断要短小&#xff0c;优先级是自高到底进行打断。 …

Cocos制作抖音小游戏接入侧边栏复访接口实例

本篇文章主要讲解&#xff0c;使用cocos接入抖音小游戏侧边栏接口的实例教程。 日期&#xff1a;2024年7月1日 作者&#xff1a;任聪聪 教程实例&#xff1a;https://download.csdn.net/download/hj960511/89509196 下载后可直接导入运行 上传游戏后抖音预审不通过 注意&#x…