当 ApplicationContext 创建一个实现 org.springframework.context.ApplicationContextAware 的对象实例时。会将 ApplicationContext 实例作为回调参数调用 setApplicationContext 方法,下面是 ApplicationContextAware 接口的定义

    1. public interface ApplicationContextAware {
    2. void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
    3. }

    因此,Bean 可以通过 ApplicationContext 接口或通过强制引用该接口的已知子类(例如ConfigurableApplicationContext,它公开了其他功能),以编程方式操纵创建它们的ApplicationContext。一个用途是 通过编程检索其他 bean。有时这种能力很有用。但是,一般来说,您应该避免使用它,因为它将代码与 Spring 耦合,并且不遵循控件反转规则,即将协作者作为属性提供给Bean。ApplicationContext 的其他方法提供对文件资源的访问、发布应用程序事件和访问消息源。ApplicationContext 的附加功能中介绍了这些附加功能

    自动装配是获取 ApplicationContext 引用的另一种选择。传统的构造函数和 byType 自动装配模式(自动装配协作者)可以分别为构造函数参数或 setter 方法参数提供 ApplicationContext 类型的依赖项。为了获得更大的灵活性,包括自动装配字段和多参数方法的能力,请使用基于注解的自动特性。如果你这样做,ApplicationContext 就会自动装配到一个字段、构造函数参数或者方法参数中,如果这个字段、构造函数或者方法带有 @Autowired 注解,那么这个字段、构造函数或者方法就会自动装配到这个字段、构造函数参数或者方法参数中。有关更多信息,请参见使用 @Autowired

    简单说,你可以直接当成依赖项注入到你的类中

    1. @Autowired
    2. private ApplicationContext applicationContext;

    当 ApplicationContext 创建一个实现 org.springframework.beans.factory.BeanNameAware 接口的类时,该类提供了对其关联对象定义中定义的名称的引用(也就是会将该类 bean 的名称回调给你)。下面的清单显示了 BeanNameAware 接口的定义:

    1. public interface BeanNameAware {
    2. void setBeanName(String name) throws BeansException;
    3. }

    在普通 bean 属性填充之后,在诸如 InitializingBean.afterPropertiesSet()或自定义 init-method 之类的初始化回调之前调用该回调。