Spring之Aware接口介绍

简介: 在Bean对象的生命周期的方法中有好几个接口是Aware接口的子接口,所以弄清楚Aware接口对于理解Spring框架还是很有帮助的。


 在Bean对象的生命周期的方法中有好几个接口是Aware接口的子接口,所以弄清楚Aware接口对于理解Spring框架还是很有帮助的。

文章目录

   Aware接口

       1.Aware系列接口的共性

       2.Aware子接口中的set方法

           2.1ApplicationContextAware

           2.2BeanClassLoaderAware

           2.3BeanFactoryAware

           2.4BeanNameAware

       3.举例说明

Aware接口

 Aware接口从字面上翻译过来是感知捕获的含义。单纯的bean(未实现Aware系列接口)是没有知觉的;实现了Aware系列接口的bean可以访问Spring容器。这些Aware系列接口增强了Spring bean的功能,但是也会造成对Spring框架的绑定,增大了与Spring框架的耦合度。(Aware是“意识到的,察觉到的”的意思,实现了Aware系列接口表明:可以意识到、可以察觉到)

接口的源码如下:

public interface Aware {
}

 可以发现该接口中并没有定义任何方法,所以这是个标识接口。该接口的子接口有如下:

image.png

1.Aware系列接口的共性

   都以“Aware”结尾

   都是Aware接口的子接口,即都继承了Aware接口

   接口内均定义了一个set方法

2.Aware子接口中的set方法

2.1ApplicationContextAware

void setApplicationContext(ApplicationContext applicationContext)

2.2BeanClassLoaderAware

void setBeanClassLoader(ClassLoader classLoader);

2.3BeanFactoryAware

void setBeanFactory(BeanFactory beanFactory)

2.4BeanNameAware

void setBeanName(String name);

…每个子接口都定义了set方法。而方法中的形参是接口Aware前面的内容,也就是当前Bean需要感知的内容。所以我们需要在Bean中声明相关的成员变量来接收。

3.举例说明

目标类

/**
 * 实现了
 *  ApplicationContextAware
 *  BeanClassLoaderAware
 *  BeanFactoryAware
 *  BeanNameAware
 *  接口
 * @author dengp
 *
 */
public class User implements ApplicationContextAware,BeanClassLoaderAware,BeanFactoryAware,BeanNameAware{
  private int id;
  private String name;
  // 保存感知的信息
  private String beanName;
  // 保存感知的信息
  private BeanFactory beanFactory;
  // 保存感知的信息
  private ApplicationContext ac;
  // 保存感知的信息
  private ClassLoader classLoader;
  public BeanFactory getBeanFactory() {
    return beanFactory;
  }
  public ApplicationContext getAc() {
    return ac;
  }
  public ClassLoader getClassLoader() {
    return classLoader;
  }
  public User(){
    System.out.println("User 被实例化");
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getBeanName() {
    return beanName;
  }
  /**
   * 自定义的初始化方法
   */
  public void start(){
    System.out.println("User 中自定义的初始化方法");
  }
  @Override
  public String toString() {
    return "User [id=" + id + ", name=" + name + ", beanName=" + beanName + "]";
  }
  @Override
  public void setBeanClassLoader(ClassLoader classLoader) {
    System.out.println(">>> setBeanClassLoader");
    this.classLoader = classLoader;
  }
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    System.out.println(">>> setApplicationContext");
    this.ac = applicationContext;
  }
  @Override
  public void setBeanName(String name) {
    System.out.println(">>> setBeanName");
    this.beanName = name;
  }
  @Override
  public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
    System.out.println(">>> setBeanFactory");
    this.beanFactory = beanFactory;
  }
}

测试类

@Test
public void test1() {
  ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  User user = ac.getBean(User.class);
  System.out.println("beanFactory:"+user.getBeanFactory());
  System.out.println("beanName:"+user.getBeanName());
  System.out.println("applicationContext:"+user.getAc());
  System.out.println("classLoader:"+user.getClassLoader());
  System.out.println(user);
}

输出结果

User 被实例化
>>> setBeanName
>>> setBeanClassLoader
>>> setBeanFactory
>>> setApplicationContext
User 中自定义的初始化方法
beanFactory:org.springframework.beans.factory.support.DefaultListableBeanFactory@4520ebad: defining beans [user]; root of factory hierarchy
beanName:user
applicationContext:org.springframework.context.support.ClassPathXmlApplicationContext@311d617d: startup date [Sun Mar 03 22:43:08 CST 2019]; root of context hierarchy
classLoader:sun.misc.Launcher$AppClassLoader@4aa298b7
User [id=0, name=波波烤鸭, beanName=user]

Aware系列接口,主要用于辅助Spring bean访问Spring容器


相关文章
|
10月前
|
XML Java 数据格式
探索Spring之利剑:ApplicationContext接口
本文深入介绍了Spring框架中的核心接口ApplicationContext,解释了其作为应用容器的功能,包括事件发布、国际化支持等,并通过基于XML和注解的配置示例展示了如何使用ApplicationContext管理Bean实例。
456 6
|
自然语言处理 JavaScript Java
Spring 实现 3 种异步流式接口,干掉接口超时烦恼
本文介绍了处理耗时接口的几种异步流式技术,包括 `ResponseBodyEmitter`、`SseEmitter` 和 `StreamingResponseBody`。这些工具可在执行耗时操作时不断向客户端响应处理结果,提升用户体验和系统性能。`ResponseBodyEmitter` 适用于动态生成内容场景,如文件上传进度;`SseEmitter` 用于实时消息推送,如状态更新;`StreamingResponseBody` 则适合大数据量传输,避免内存溢出。文中提供了具体示例和 GitHub 地址,帮助读者更好地理解和应用这些技术。
2112 121
|
存储 Java 数据安全/隐私保护
Spring Boot中实现邮箱登录/注册接口
Spring Boot中实现邮箱登录/注册接口
|
12月前
|
存储 安全 Java
|
存储 数据采集 Java
Spring Boot 3 实现GZIP压缩优化:显著减少接口流量消耗!
在Web开发过程中,随着应用规模的扩大和用户量的增长,接口流量的消耗成为了一个不容忽视的问题。为了提升应用的性能和用户体验,减少带宽占用,数据压缩成为了一个重要的优化手段。在Spring Boot 3中,通过集成GZIP压缩技术,我们可以显著减少接口流量的消耗,从而优化应用的性能。本文将详细介绍如何在Spring Boot 3中实现GZIP压缩优化。
1415 6
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
380 0
|
设计模式 自然语言处理 Java
简单了解下Spring中的各种Aware接口实现依赖注入
在Spring框架中,Aware接口是一组用于提供特定资源或环境信息的回调接口。这些接口被设计用来允许Bean获取对Spring容器或其他相关资源的引用,并在需要时进行适当的处理。
170 2
|
SQL Java 数据库
实时计算 Flink版产品使用问题之Spring Boot集成Flink可以通过什么方式实现通过接口启动和关闭Flink程序
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。