Spring Aware接口详解

简介: 若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资源。

若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资源。


Spring 中提供的 Aware 接口有:


BeanNameAware:注入当前 bean 对应 beanName

BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader

BeanFactoryAware:注入 当前BeanFactory容器 的引用

1.png


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框架。

目录
相关文章
|
2月前
|
存储 安全 Java
|
6月前
|
存储 Java 数据安全/隐私保护
Spring Boot中实现邮箱登录/注册接口
Spring Boot中实现邮箱登录/注册接口
|
2月前
|
自然语言处理 JavaScript Java
Spring 实现 3 种异步流式接口,干掉接口超时烦恼
本文介绍了处理耗时接口的几种异步流式技术,包括 `ResponseBodyEmitter`、`SseEmitter` 和 `StreamingResponseBody`。这些工具可在执行耗时操作时不断向客户端响应处理结果,提升用户体验和系统性能。`ResponseBodyEmitter` 适用于动态生成内容场景,如文件上传进度;`SseEmitter` 用于实时消息推送,如状态更新;`StreamingResponseBody` 则适合大数据量传输,避免内存溢出。文中提供了具体示例和 GitHub 地址,帮助读者更好地理解和应用这些技术。
247 0
|
3月前
|
存储 数据采集 Java
Spring Boot 3 实现GZIP压缩优化:显著减少接口流量消耗!
在Web开发过程中,随着应用规模的扩大和用户量的增长,接口流量的消耗成为了一个不容忽视的问题。为了提升应用的性能和用户体验,减少带宽占用,数据压缩成为了一个重要的优化手段。在Spring Boot 3中,通过集成GZIP压缩技术,我们可以显著减少接口流量的消耗,从而优化应用的性能。本文将详细介绍如何在Spring Boot 3中实现GZIP压缩优化。
371 6
|
2月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
41 0
|
4月前
|
JSON 安全 Java
|
4月前
|
设计模式 自然语言处理 Java
简单了解下Spring中的各种Aware接口实现依赖注入
在Spring框架中,Aware接口是一组用于提供特定资源或环境信息的回调接口。这些接口被设计用来允许Bean获取对Spring容器或其他相关资源的引用,并在需要时进行适当的处理。
38 2
|
4月前
|
存储 SQL Java
|
4月前
|
自然语言处理 Java 开发者
简单了解下Spring中的各种Aware接口实现依赖注入
【8月更文挑战第21天】在Spring框架中,Aware接口系列是一种特殊的机制,它允许Bean在初始化过程中获取到Spring容器或容器中的特定资源,从而实现了更加灵活和强大的依赖注入方式。本文将围绕Spring中的各种Aware接口,详细探讨它们如何帮助开发者在工作和学习中更好地实现依赖注入。
111 0
|
4月前
|
JavaScript Java Spring
Spring Boot 接口返回文件流
Spring Boot 接口返回文件流
134 0
下一篇
无影云桌面