Spring的Aware接口你知道多少
作者:JavaEdge. 发布时间:2023-01-19 12:44:20
若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资源。
Spring 中提供的 Aware 接口有:
BeanNameAware
:注入当前 bean 对应 beanNameBeanClassLoaderAware
:注入加载当前 bean 的 ClassLoaderBeanFactoryAware
:注入 当前BeanFactory容器 的引用
BeanNameAware
和BeanFactoryAware
都属于org.springframework.beans.factory.Aware
根标记接口。
其使用setter注入来在应用程序上下文启动期间获取对象。
Aware接口是回调, * 和观察者设计模式的混合,它表示bean有资格通过回调方式被Spring容器通知。
1 BeanNameAware
使对象能够知道容器中定义的bean名称。
public class MyBeanName implements BeanNameAware {
@Override
public void setBeanName(String beanName) {
System.out.println(beanName);
}
}
beanName属性表示在Spring容器中注册的bean id,在我们的实现中,只是显示bean名称。
在Spring配置类中注册这种类型的bean:
@Configuration
public class Config {
@Bean(name = "myCustomBeanName")
public MyBeanName getMyBeanName() {
return new MyBeanName();
}
}
启动应用程序上下文并从中获取bean:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
MyBeanName myBeanName = context.getBean(MyBeanName.class);
setBeanName方法打印出了“myCustomBeanName”。
若从@Bean注解中删除name =“…”代码,则在这种情况下,将getMyBeanName()方法名称分配给bean,所以输出将是“getMyBeanName”。
2 BeanFactoryAware
用于注入BeanFactory对象,就能访问创建对象的BeanFactory。
public class MyBeanFactory implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
public void getMyBeanName() {
MyBeanName myBeanName = beanFactory.getBean(MyBeanName.class);
System.out.println(beanFactory.isSingleton("myCustomBeanName"));
}
}
在setBeanFactory()方法的帮助下,我们将IoC容器中的BeanFactory引用分配给beanFactory属性。
然后,我们可以像在getMyBeanName()
函数中一样直接使用它。
初始化MyBeanFactory
并调用getMyBeanName()
方法:
MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class);
myBeanFactory.getMyBeanName();
由于我们已经在前面的示例中实例化了MyBeanName类,因此Spring将在此处调用现有实例。
3 适用场景
获取bean名称以进行日志记录或埋点,对于BeanFactoryAware,它可以使用扩展代码中的spring bean。
大多数情况下,应避免使用任何Aware接口,因为实现这些接口会将代码耦合到Spring框架。
来源:https://blog.csdn.net/qq_33589510/article/details/122870732


猜你喜欢
- 1、作用域1.1 作用域的作用作用域——scope通常来说,一段程序代码中所用到的名字并不总是有效/
- 需求场景最近项目中要做一个音乐播放悬浮按钮的功能,最终实现效果如下:问题暴露悬浮窗布局文件就不放了,就是水平LinearLayout里面放几
- 归并排序里运用到算法里很重要的一个思想——分治法:将原问题分解为几个规模较小但类似于原问题的子问题——《算法导论》。在每一层递归中都有3个步
- 用法1 为原始类型扩展方法先说一下,this 后面跟的类型,就是要拓展方法的类型。注意要写在静态类中的静态方法,不然有些情况下访问/// &
- SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一
- WebService是一种跨编程语言和跨操作系统平台的远程调用技术所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一
- 一、本地仓库初始化与远程仓库推送操作Idea 基本环境配置Github 配置Git 执行文件目录指定创建工程git02创建本地仓库并提交项目
- 最近要给一个 Winform 项目添加功能,需要一个能显示进度条的弹窗,还要求能够中止任务,所以就做了一个,在此做个记录总结。虽然用的是比较
- 1 基本概念ThreadLocal类提供了线程局部变量。这些变量与普通变量的不同之处在于,每个访问一个变量(通过其get或set方法)的线程
- 近日沉醉于熟悉公司新项目的过程,不断地接触新的应用场景与实现技术,对于我是一种学不来的进步,实践是检验真理的唯一标准。我们今天就浅浅的谈一谈
- 安装方法一:1.Android studio File->Settings..->Plugins–>Browse repo
- 循环语句就是让计算机根据条件做循环计算,在条件满足时继续循环,条件不满足时退出循环。Java提供了while条件循环。它的基本用法是:whi
- 本文实例讲述了Android开发之SD卡文件操作。分享给大家供大家参考,具体如下:前面的文章中写过直接操作手机自带存储器的程序,这次就接着上
- Java 多线程方法详解startstart方法 启动线程 在start方法中调用start0方法,而start0是一个
- 目录推荐教程正文创建-服务端-生成代码创建客户端,生成客户端代码先下载soapUI工具推荐教程idea2021以下最新安装j ihuo 教程
- Flutter 键值存储数据库键值存储是开发中十分常见的需求,在Flutter开发中,一般使用 shared_preferences 插件来
- 最近因为用的发送邮件的地方,就查询了资料,总结以下几个方法1、利用新浪邮箱发送2、利用公司邮箱发送3、利用CDO发送,这种方式要引用Inte
- Semaphore、SemaphoreSlim 类两者都可以限制同时访问某一资源或资源池的线程数。这里先不扯理论,我们从案例入手,通过示例代
- 一、背景新做了一个的需求,需要在SpringBoot项目中引入了多个依赖,然后就感觉idea下载依赖包的时间很漫长,然后我就网上找了解决办法
- 线程池主要解决两个问题:一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,