当 Spring 容器创建对象时,如果实现了 ApplicationContextAware 接口,那么这个实例会持有 ApplicationContext 的引用。 ApplicationContextAware 接口的定义如下:
public interface ApplicationContextAware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
因此,通过持有 ApplicationContext 引用或者把引用转化为 ApplicationContext 的子类(比如,ConfigurableApplicationContext,它具备额外的功能),beans 可以使用编程方式来操作 ApplicationContext 容器。其中一个用途是通过容器获取其他 bean 的引用,这个用途在某些场景下非常有用。但是,通常情况下,不建议这样做,也因该避免这样做。因为这样会使得代码和 Spring 框架进行耦合,并且不遵循控制反转风格,在控制反转风格中,依赖项作为属性提供给 bean。ApplicationContext 的还拥有其他的方法提供对文件资源、发布应用程序事件和MessageSource 的访问。详细情况,点击这里。// 获取非单例 bean 的时候用到了 ApplicationContext
自动装配是获取 ApplicationContext 的另一种方式。传统的构造函数和 byType 自动装配模式可以分别为构造函数参数或 setter 方法参数提供类型为 ApplicationContext 的依赖项。同时,使用基于注解的方式,如果在 ApplicationContext 类型相关的字段、构造器或者方法上带有 @Autowired 注解,那么 ApplicationContext 容器会自动进行装配。// 通过自动装配获取 ApplicationContext 容器
如果一个类实现了 org.springframework.beans.factory.BeanNameAware 接口,那么这个类持有了该 bean 定义中定义的名称的引用。BeanNameAware 接口的定义如下:
public interface BeanNameAware {
void setBeanName(String name) throws BeansException;
}
这些函数的回调会在填充普通 bean 属性之后调用,但会在初始化回调函数之前调用,比如 InitializingBean.afterPropertiesSet() 或者自定义的 init-method 方法之前。
除了 ApplicationContextAware 和 BeanNameAware,Spring 还提供了很多 aware 的回调接口,可以让实现这些接口的 bean 能够访问一些基础的依赖项。通常来说,aware 接口的名称就指示了依赖项的类型。更多 aware 接口,点击这里。
请再次注意,使用这些接口,你的代码将与 Spring API 进行耦合,并且不遵循控制反转风格。因此,我们建议将它用于需要对容器中基础依赖项进行代码访问的 beans。
// aware 类接口提供对底层依赖项的访问支持。可以修改和操作一些底层属性。