回答
Aware
接口是 Spring 提供的一组标志性接口,所有以 *Aware
结尾的接口都具有 "感知" 的能力。通过实现这些接口,Spring 会在 Bean 的生命周期中,自动将对应的容器资源(如 ApplicationContext、BeanFactory 等)注入到 Bean 中,从而使 Bean 能够与 Spring 容器进行交互。
Aware
接口的核心逻辑是依赖于 BeanPostProcessor 的实现。当 Bean 实现某个 Aware 接口时,Spring 的 ApplicationContextAwareProcessor
会在 Bean 初始化后,调用对应的方法注入相关的资源。
详解
源码解析
我们直接看 Aware
接口定义:
/**
* Marker superinterface indicating that a bean is eligible to be
* notified by the Spring container of a particular framework object
* through a callback-style method. Actual method signature is
* determined by individual subinterfaces, but should typically
* consist of just one void-returning method that accepts a single
* argument.
*
* <p>Note that merely implementing {@link Aware} provides no default
* functionality. Rather, processing must be done explicitly, for example
* in a {@link org.springframework.beans.factory.config.BeanPostProcessor BeanPostProcessor}.
* Refer to {@link org.springframework.context.support.ApplicationContextAwareProcessor}
* and {@link org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory}
* for examples of processing {@code *Aware} interface callbacks.
*
* @author Chris Beams
* @since 3.1
*/
public interface Aware {
}
Aware
接口为 Spring 容器的核心接口,是一个具有标识作用的超级接口,实现了该接口的 bean 是具有被 Spring 容器通知的能力,通知的方式是采用回调的方式。
Aware
接口是一个空接口,实际的方法签名由各个子接口来确定,且该接口通常只会有一个接收单参数的 set 方法,该 set 方法的命名方式为 set + 去掉接口名中的 Aware 后缀,即 XxxAware
接口,则方法定义为 setXxx()
,例如 BeanNameAware(setBeanName)
,ApplicationContextAware(setApplicationContext)
。
Aware
的子接口需要提供一个 setXxx
方法,我们知道 set 是设置属性值的方法,即 Aware 类接口的 setXxx
方法其实就是设置 xxx 属性值的。 Aware
的含义是感知的、感应的,那么在 Spring 容器中是如何实现感知并设置属性值得呢?我们可以从初始化 bean 中的激活 Aware 的方法 invokeAwareMethods()
中看到一点点,如下: