查看Spring相关源码,会发现很多类都实现了各种 xxxAware 接口。为什么实现 Aware 接口,作用是什么?
先看Aware 接口的文档说明
简单翻译一下,实现Aware
接口的bean可以被Spring 容器通过回掉方式处理,但是这个接口只是一个标记接口,类似于java.io.Serializable
用于标记对象可序列化,java.util.RandomAccess
表明支持快速访问。需要使用子接口来完成功能。
继续看下 Aware
接口的子接口有哪些
有两个比较熟悉的子接口,ApplicationContextAware
和 BeanNameAware
。
在SpringBoot项目获取ApplicationContext中有通过实现ApplicationContextAware
接口可以获得ApplicationContext
对象。
例子:实现 BeanNameAware
接口,自定义bean 的名称
运行结果
测试结果说明bean 获取到了自己的bean 名称。
所以当一个bean 实现了某个Aware
接口的子接口时,这个bean就获得了这个子接口中 setXXX 方法的传递的参数对象。
Aware
及其子接口是怎么作用的呢?
实现标记接口的对象一般是通过 instanceof 关键字进行判断是否是其实现类。因此可以利用开发工具查看。
以BeanNameAware
为例:
查看到了关键信息,点进去
这里就是具体的回掉了。
先判断是否是Aware
接口的实现类,如果是,再判断是否是BeanNameAware
的实现类,进行调用接口方法。
两个参数按名识义,beanName 是 bean 名称,bean 就是具体的bean对象。
继续查找方法被哪里调用,
初始化bean的时候调用,这个只是判断有没有开启安全管理器。
继续查看哪些地方调用。
虽然调用这个方法的地方有点多,但是依然可以看到一个很熟悉的方法doCreateBean
,这个是创建bean对象具体实现的方法。
到这里就很明确了,如果一个bean 实现了Aware
接口,在创建这个bean的时候,通过 instanceof
关键字,判断具体实现了哪个 Aware
,然后调用 xxxAware 中的 setXXX 方法。