学习了上一章的 bean 生命周期,你会发现很多地方使用了 Aware 结尾的接口,那他们有什么用呢?

一、介绍

aware接口

aware,翻译过来是知道的,已感知的,意识到的,所以这些接口从字面意思应该是能感知到所有 Aware 前面的含义。

二、举例

光从上面的介绍很难理解他到底有什么作用,下面举个例子就能直观的知道 aware 的作用

先举个 BeanNameAware 的例子,实现 BeanNameAware 接口,可以让该 Bean 感知到自身的 BeanName(对应 Spring 容器的 BeanId 属性)属性

BeanNameAware 接口的定义

public interface BeanNameAware extends Aware {

void setBeanName(String name);

}

定义两个 User,一个实现 BeanNameAware,一个不实现。

User

package cn.gameboys.aware;

import org.springframework.beans.factory.BeanNameAware;

public class User implements BeanNameAware {

private String id;

private String name;

private String beanName;

@Override

public void setBeanName(String name) {

this.beanName = name;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "User [id=" + id + ", name=" + name + ", beanName=" + beanName + "]";

}

}

User2

package cn.gameboys.aware;

public class User2 {

private String id;

private String name;

private String beanName;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "User [id=" + id + ", name=" + name + ", beanName=" + beanName + "]";

}

}

在 Spring 配置文件中初始化两个对象。

main 方法测试一下 BeanNameAware 接口所起的作用。

package cn.gameboys.aware;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public abstract class Test {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext("aware-test.xml");

User user = context.getBean(User.class);

System.out.println(String.format("实现了BeanNameAware接口的信息BeanId=%s,所有信息=%s", user.getId(), user.toString()));

User2 user2 = context.getBean(User2.class);

System.out.println(String.format("未实现BeanNameAware接口的信息BeanId=%s,所有信息=%s", user2.getId(), user2.toString()));

}

}

运行结果

实现了BeanNameAware接口的信息BeanId=66,所有信息=User [id=66, name=zhangsan, beanName=zhangsanBean]

未实现BeanNameAware接口的信息BeanId=77,所有信息=User [id=77, name=lisi, beanName=null]

能够看到,我们在实现了BeanNameAware的 User 中,获取到了 Spring 容器中的 BeanId(对应 spring 配置文件中的 id 属性),

而没有实现 BeanNameAware 的 User2,则不能获取到 Spring 容器中的 Id 属性。

三、结论

BeanNameAware 接口是为了让自身 Bean 能够感知到,获取到自身在 Spring 容器中的 id 属性。

其他的 Aware 接口也是为了能够感知到自身的一些属性。比如实现了ApplicationContextAware接口的类,能够获取到ApplicationContext,实现了BeanFactoryAware接口的类,能够获取到BeanFactory对象。

aware java_Spring中Aware接口说明相关推荐

  1. aware java_spring中一些aware接口

    Spring中提供一些Aware相关接口,像是BeanFactoryAware. ApplicationContextAware.ResourceLoaderAware.ServletContextA ...

  2. Spring中Aware的用法以及实现

    Aware 在Spring当中有一些内置的对象是未开放给我们使用的,例如Spring的上下文ApplicationContext.环境属性Environment,BeanFactory等等其他的一些内 ...

  3. C++中的接口(抽象类)

    1.Cpp中的接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现.接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念.如果类中至少有一 ...

  4. Java中实现接口与继承的区别

    ** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...

  5. Objective-C 入门(七)协议 protocol(JAVA中的接口)

    Objective-C 入门(七)协议 protocol(JAVA中的接口) 接口的作用想必大家都比较了解 OV中的 protocol 相比接口作用相似 语法稍有不同 1.先来看声明一个协议 在创建文 ...

  6. Android中Parcelable接口用法

    --  通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象.也可以将Parcel看成是一个流,通过writeToPa ...

  7. Java中的接口命名[关闭]

    本文翻译自:Interface naming in Java [closed] Most OO languages prefix their interface names with a capita ...

  8. 初步解读Golang中的接口相关编写方法

    初步解读Golang中的接口相关编写方法 概述如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口 ...

  9. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

最新文章

  1. 《C++代码设计与重用》——1.2 重用的神话
  2. 清华姚班校友陈丹琦斩获2022斯隆奖!「诺奖风向标」27位华人学者入选
  3. vue2.0 rem运行环境搭建
  4. hdu2846(2009多校第四场) 字典树
  5. CTO要我把这份MySQL规范贴在工位上!
  6. winform 与WPF
  7. oracle 自动表分析,Oracle自动分析索引,表
  8. python整数类型没有取值范围限制_详解Python中6种数据类型
  9. windows 禁用ipv6服务_Win7电脑禁用ipv6协议的方法是什么?
  10. Cross-Site Scripting(XSS): 跨站脚本攻击介绍
  11. 一篇文章带你搞懂观察者模式
  12. 入门系列之基于MATLAB的滚动轴承内外圈复合线性剥落故障动力学建模
  13. 增长黑客AB-Test系统(四)——AB-Test 最小样本量
  14. 最新财报发布+天猫618双榜第一,耐克蓄力领跑下个50年
  15. 回想那天让我虎躯一震的bug:Mybatis Ognl引起的异常
  16. STM32H7学习继续(STM32H7系列9) ADC
  17. Echarts双Y轴图表处理
  18. python经典教程_零基础 Python爬虫经典实战教程
  19. 关于Android开发的面试经验总结,妈妈再也不用担心我找工作了!
  20. C++虚函数实现机制

热门文章

  1. 策略服务器无法启动显示错误1053,启动Windows服务失败,出现错误1053
  2. 2022年,大厂都在招什么样的Linux运维?
  3. ios沙箱软件_ios真机和模拟器沙盒文件(一)
  4. 警方突袭德国间谍软件公司
  5. moment(‘time‘,‘YYYY-MM-DD HH:mm:ss‘)和moment(‘time‘).format(‘YYYY-MM-DD HH:mm:ss‘)的区别
  6. 【软件工程】《黑客与画家》系列08[完结]-设计与研究2(节选)
  7. 干燥季节应喝丝瓜蛋汤
  8. day-12函数进阶
  9. Mysql执行计划和Mysql优化
  10. C++ 创建数组并初始化