Spring 中的 Aware 相关接口

查看Spring相关源码,会发现很多类都实现了各种 xxxAware 接口。为什么实现 Aware 接口,作用是什么?

先看Aware 接口的文档说明
Spring 中的 Aware 相关接口
简单翻译一下,实现Aware接口的bean可以被Spring 容器通过回掉方式处理,但是这个接口只是一个标记接口,类似于java.io.Serializable 用于标记对象可序列化,java.util.RandomAccess 表明支持快速访问。需要使用子接口来完成功能。

继续看下 Aware接口的子接口有哪些

Spring 中的 Aware 相关接口
有两个比较熟悉的子接口,ApplicationContextAwareBeanNameAware
SpringBoot项目获取ApplicationContext中有通过实现ApplicationContextAware接口可以获得ApplicationContext对象。

例子:实现 BeanNameAware 接口,自定义bean 的名称
Spring 中的 Aware 相关接口

运行结果

Spring 中的 Aware 相关接口
测试结果说明bean 获取到了自己的bean 名称。
所以当一个bean 实现了某个Aware 接口的子接口时,这个bean就获得了这个子接口中 setXXX 方法的传递的参数对象。

Aware 及其子接口是怎么作用的呢?

实现标记接口的对象一般是通过 instanceof 关键字进行判断是否是其实现类。因此可以利用开发工具查看。
BeanNameAware为例:
Spring 中的 Aware 相关接口
查看到了关键信息,点进去
Spring 中的 Aware 相关接口
这里就是具体的回掉了。
先判断是否是Aware接口的实现类,如果是,再判断是否是BeanNameAware的实现类,进行调用接口方法。
两个参数按名识义,beanName 是 bean 名称,bean 就是具体的bean对象。

继续查找方法被哪里调用,
Spring 中的 Aware 相关接口
初始化bean的时候调用,这个只是判断有没有开启安全管理器。

继续查看哪些地方调用。
Spring 中的 Aware 相关接口
虽然调用这个方法的地方有点多,但是依然可以看到一个很熟悉的方法doCreateBean ,这个是创建bean对象具体实现的方法。

到这里就很明确了,如果一个bean 实现了Aware 接口,在创建这个bean的时候,通过 instanceof 关键字,判断具体实现了哪个 Aware ,然后调用 xxxAware 中的 setXXX 方法。

上一篇:Aware自动装配


下一篇:Spring 各种 Aware 接口回调注入