【Spring】关于Spring中aware相关接口的作用

Aware 接口的回调方法是在 Bean 实例化之后调用的。具体来说,这些回调方法是在依赖注入完成后,但在 Bean 完全初始化之前调用的。这是 Spring 容器管理 Bean 生命周期的一部分

完成了属性赋值之后,Spring会执行一些回调,包括: 1. BeanNameAware:回传beanName给bean对象。 2. BeanClassLoaderAware:回传classLoader给bean对象。 3. BeanFactoryAware:回传beanFactory

1、BeanNameAware:

  • 回调目的:告诉 Bean 它自己的名字。
  • 大白话解释:Spring 会调用 setBeanName(String name) 方法,把 Bean 的名字告诉给 Bean 本身。这样,Bean 就知道它在 Spring 容器中的名字是什么。
  • 应用场景:如果你的 Bean 需要知道自己在 Spring 容器中的名字,可以实现 BeanNameAware 接口。

2、BeanClassLoaderAware:

  • 回调目的:告诉 Bean 它的类加载器。
  • 大白话解释:Spring 会调用 setBeanClassLoader(ClassLoader classLoader) 方法,把类加载器告诉给 Bean 本身。这样,Bean 就可以使用这个类加载器来加载类。
  • 应用场景:如果你的 Bean 需要动态加载类,可以实现 BeanClassLoaderAware 接口。

3、BeanFactoryAware:

  • 回调目的:告诉 Bean 它所在的 BeanFactory。
  • 大白话解释:Spring 会调用 setBeanFactory(BeanFactory beanFactory) 方法,把 BeanFactory 的引用告诉给 Bean 本身。这样,Bean 就可以访问和操作整个 Spring 容器。
  • 应用场景:如果你的 Bean 需要访问 Spring 容器中的其他 Bean,或者需要执行一些与容器相关的操作,可以实现 BeanFactoryAware 接口。

当然Spring中还有很多其它功能的aware接口或者自定义aware接口

具体示例

1. 定义 MyBean 类
首先,定义一个 MyBean 类,实现 BeanNameAware、BeanClassLoaderAware 和 BeanFactoryAware 接口:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.BeanClassLoaderAware;public class MyBean implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware {private String beanName;private ClassLoader classLoader;private BeanFactory beanFactory;@Overridepublic void setBeanName(String name) {this.beanName = name;System.out.println("Bean name is: " + name);}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {this.classLoader = classLoader;System.out.println("Class loader is: " + classLoader);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;System.out.println("BeanFactory is: " + beanFactory);}public void doSomething() {System.out.println("Doing something...");// 你可以在这里使用 beanName、classLoader 和 beanFactory}
}

2. 定义配置类
接下来,定义一个配置类,使用 @Configuration 和 @Bean 注解来配置 MyBean:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}
}

3. 启动 Spring 应用

最后,编写一个主类来启动 Spring 应用,并获取 MyBean 实例

import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {// 创建 Spring 应用上下文AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 获取 MyBean 实例MyBean myBean = context.getBean(MyBean.class);// 调用 MyBean 的方法myBean.doSomething();// 关闭上下文context.close();}
}

运行结果
当你运行 Main 类时,你会看到类似以下的输出

解释
1、MyBean 类:

  • 实现了 BeanNameAware、BeanClassLoaderAware 和 BeanFactoryAware 接口。
  • 重写了 setBeanName、setBeanClassLoader 和 setBeanFactory 方法,在这些方法中打印相关信息。

2、AppConfig 类:

  • 使用 @Configuration 注解标记为配置类。
  • 使用 @Bean 注解定义 MyBean 的 Bean。

3、Main 类:

  • 使用 AnnotationConfigApplicationContext 创建 Spring 应用上下文,并传入配置类 AppConfig。
  • 从上下文中获取 MyBean 实例,并调用其 doSomething 方法。
  • 最后关闭上下文。

通过这种方式,你可以使用纯 Java 配置来实现 BeanNameAware、BeanClassLoaderAware 和 BeanFactoryAware 回调

当然还有更多的

ApplicationContextAwareProcessor会在初始化前这个步骤中进行其他Aware的回调:
  • i. EnvironmentAware:回传环境变量
  • ii. EmbeddedValueResolverAware:回传占位符解析器
  • iii. ResourceLoaderAware:回传资源加载器
  • iv. ApplicationEventPublisherAware:回传事件发布器
  • v. MessageSourceAware:回传国际化资源
  • vi. ApplicationStartupAware:回传应用其他监听对象,可忽略
  • vii. ApplicationContextAware:回传Spring容器ApplicationContext

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

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

相关文章

java中Set,Map,List集合的比较(不包含增删改查函数方法)

目录 1. 集合的简介2. List3. Set4. Map5. 比较5.1 结构特点5.2 实现类5.3 区别 6. 其他问题6.1 集合与数组的区别6.2 哪些集合类是线程安全的 7. 参考链接 1. 集合的简介 所有的集合类和集合接口都在java.util包下。 在内存中申请一块空间用来存储数据,在Java中集…

langchain的使用以及算力的计算

文章目录 提示词提示词 import warnings warnings.filterwarnings("ignore") from langchain import PromptTemplate,LLMChain from llm import ChatGLM# 简单的问题模板 template = """问题: {question}答案: """ prompt = PromptTe…

C++加载sqlite3数据库文件

db数据库文件简单轻便,形式上可以像excel数据那样,但是解析的时候却有很大的灵活性。使用Python解析db数据已经是很简单的事情,使用专门的数据库可视化工具,通过sql语句查询内容也是有手就行,也许C也不难,但…

31省226地级市极端天气和气候风险指数 (1993-2023年)附下载链接

1993-2023年31省、226个地级市极端天气和气候风险指数 下载链接-点它👉👉:1993-2023年31省、226个地级市极端天气和气候风险指数-最新出炉.zip 数据名称 1993~2023 省市级气候风险指数 数据来源 nature 子刊,已转…

DEPT:DECOMPOSED PROMPT TUNING FOR PARAMETER-EFFICIENT FINE-TUNING

论文汇总 当前的问题 (1)Prompt Tuning通常收敛缓慢,并且对初始化敏感; (2)Prompt Tuning延长了输入序列的总长度,从而加剧了计算需求(即训练/推理时间和内存成本),这是由于Transformer的二次复杂度(Vaswani et al, 2017)。 解…

鸿蒙开发:实现全局异常捕获和异常查看

前言 开发中的异常信息,我们很容易排查,直接可以在控制台中就可以查看,但是,提交给测试同学或者上线后的异常信息,我们如何获取呢?这里我们很容易想起,三方sdk,比如常见的腾讯Bugly…

基于Springboot+Vue的学校课程管理系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

vue之打包配置环境

一直以来都是用脚手架直接搭建的项目,也很少去深究,前两天因为环境配置变更,稍微研究了下 NODE_ENV 首先 在evn.xxx 的配置文件里 一定要有的NODE_ENV NODE_ENV 默认只有两种状态即development和production development: 指代本地开发即localhost环境(本地的开发…

VirtualBox虚拟机桥接模式固定ip详解

VirtualBox虚拟机桥接模式固定ip详解 VirtualBox 桥接设置Ubuntu 24.04使用固定IP问题记录 VirtualBox 桥接设置 为什么设置桥接模式?桥接模式可以实现物理机和虚拟机互相通信,虚拟机也可以访问互联网(推荐万金油),物…

EIR管理机卡绑定配置

EIR(Equipment Identity Register)管理中的机卡绑定配置通常涉及到设备与SIM卡的关系维护,以确保网络能够正确识别和管理设备的身份。下面是关于EIR管理支持机卡绑定配置的一些主要步骤和概念: 1. 概念介绍 机卡绑定&#xff1a…

2020款Macbook Pro A2251无法充电无法开机定位及修复

问题背景 up主有一台2020年的Macbook Pro,带Touch Bar,16G512G,四核I5,型号A2251 应该是一周没充电了,之前还用的好好的,后来有一天出差想带上 打开没电,手头上有个小米的66W快充头&#xff0c…

LeetCode常用算法模板

代码模板 1、DFS:适用于树和图的遍历、组合问题。 2、BFS:适用于树和图的层次遍历、最短路径问题。 3、二分查找:适用于有序数组的搜索问题。 4、动态规划:适用于最优化问题、序列问题。 5、贪心算法:适用于局部最优问…

(二)Windows通过vs c++编译PaddleOCR-2.8.1

编译环境 操作系统:windows 11 paddleOCR版本:2.8.1 opencv版本:4.10.0 cmake版本:3.22.6 git版本:2.47.0 visual statio版本:VS 2022 Community(选择社区版本即可,安装时记得…

python离线安装依赖

以pymsql依赖为例操作如下: Python Package Index(PyPI)的官方网址是: PyPI The Python Package Index 在这个网站上,你可以搜索、浏览和下载Python包。 tar -xvzf pymysql2-1.3.3.tar.gz cd pymysql2-1.3.3 python setup.p…

Angular 框架入门教程:从安装到路由、服务与状态管理详解

一、引言 在前端开发领域,Angular 是一个强大且流行的框架。它由 Google 维护,基于 TypeScript,采用模块化设计,提供了组件化开发、依赖注入、路由、表单处理等丰富功能,旨在帮助开发者构建高效、可维护的单页应用程序…

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问:当网站遇到突发的高流量情况,如热门产品促销活动、新闻热点事件导致网站访问量激增时,服务器可能会因承受过多请求而无法及时响应。例如,电商平台在 “双十一” 等购物节期间,大量用户同时…

文生图的底层逻辑比你想象中简单!从大语言模型到大型多模态模型的演进与展望

2024年8月15日,来自浙江农林大学(数学与计算机科学学院)冯海林团队在CMC期刊发表名为“Evolution and Prospects of Foundation Models: From Large Language Models to Large Multimodal Models”的文章。在这篇文章中,研究团队首…

铲屎官们快来交作业!双十一性价比高的宠物空气净化器求推荐?

好不容易等到一年一度的双十一,这个购物狂欢节我肯定不能错过。除了自己买买买外,还准备给我家小猫也买个礼物。之前听说宠物空气净化器对养宠家庭作用很大,打算趁活动拿下。 不看不知道,一看吓一跳,有点太贵了吧&…

【SoC】被忽略的reset结构设计

1024这天爆出来的设计失误,真的很应景啦! 先献上A72的reset结构图吧,虽然最终的解决方案不是按照这个来的,不过也给了一个相对较清晰的reset架构了。 异步复位树 当对整个电路进行复位的时候,使用异步复位&#xff0c…

spark统一内存模型 详解

Apache Spark 是一个用于大规模数据处理的分布式计算框架,它支持多种处理模型(如批处理、流处理、SQL、机器学习等)。为了高效地在分布式环境中处理这些多样化的工作负载,Spark 在 2.x 版本后引入了统一内存管理模型,以…