1 ApplicationContextAware
当一个ApplicationContext创建一个实现org.springframework.context.ApplicationContextAware接口的实例时,为实例提供一个ApplicationContext引用。
public interface ApplicationContextAware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
因此Beans能以编程方式操作创建它们的ApplicationContext,通过ApplicationContext接口或通过转换引用为该接口的已知子类,例如暴漏额外功能的ConfigurableApplicationContext。我们可以使用编程方式检索其它beans。有时这种能力是有用的;然而,通常你应该避免,因为它捆绑了Spring的代码并且不符合控制反转的风格。ApplicationContext提供访问文件资源、发布应用事件和访问MessageSource的其它方法。
从Spring 2.5开始,自动注入是获取ApplicationContext引用的另一种选择。“传统的”constructor和byType自动注入模式能为构造函数参数或setter方法参数提供ApplicationContext类型的依赖注入。更多灵活性,包括能够自动注入字段和多个参数方法,使用新的基于注解的自动注入特性。如果你这么做,ApplicationContext可以自动注入到字段、构造函数参数或方法参数。
2 BeanNameAware
当一个ApplicationContext创建类实现org.springframework.beans.factory.BeanNameAware接口,容器为类提供一个该类的bean名称。
public interface BeanNameAware {
void setBeanName(String name) throws BeansException;
}
在普通bean属性填充之后调用,但在初始化回调(InitializingBean的afterPropertiesSet方法或自定义的init-method方法)之前调用。
3 其它感知接口
除了ApplicationContextAware和BeanNameAware,Spring支持一系列Aware接口,允许beans告诉容器它们需要某一基础设施依赖。大多数重要的Aware接口总结如下——一般情况下,名称是依赖类型的很好的表示:
表 Aware接口
名称 |
依赖注入 |
ApplicationContextAware | 声明ApplicationContext |
ApplicationEventPublisherAware | 封装ApplicationContext的事件发布者 |
BeanClassLoaderAware | 用于加载Bean类的类加载器 |
BeanFactoryAware | 声明BeanFactory |
BeanNameAware | 声明Bean的名称 |
BootstrapContextAware | 容器中运行的资源适配器BootstrapContext。通常只在JCA感知ApplicationContext中有效 |
LoadTimeWeaverAware | 定义在加载时间处理类定义的weaver |
MessageSourceAware | 解析消息的配置策略(提供参数化和国际化) |
NotificationPublisherAware | Spring JMX通知发布者 |
PortletConfigAware | 当前容器运行的PortletConfig。只在web感知的Spring ApplicationContext中有效 |
PortletContextAware | 当前容器运行的PortletContext。只在web感知的Spring ApplicationContext中有效 |
ResourceLoaderAware | 底层访问资源的配置加载器 |
ServletConfigAware | 当前容器运行的ServletConfig。只在web感知的Spring ApplicationContext中有效 |
ServletContextAware | 当前容器运行的ServletContext。只在web感知的Spring ApplicationContext中有效 |
请再次注意,使用这些接口的代码会与Spring API捆绑,不符合控制反转风格。