Spring中的Aware接口的使用——ApplicationContextAware与BeanNameAware
当ApplicationContext创建一个实现org.springframework.context.ApplicationContextAware接口的对象实例时,该实例将会提供一个对ApplicationContext的引用。以下显示了ApplicationContextAware接口的定义:
public interface ApplicationContextAware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
因此,bean可以以编程的方式创建他们自己的ApplicationContext,通过ApplicationContext接口或者通过这个接口的子类的引用(比如:ConfigurableApplicationContext)可以暴露额外的功能。一种用途是对其他bean进行编程检索。有时这种能力是有用的。但是,一般来说,您应该避免使用它,因为它将代码与Spring耦合起来,并且不遵循像其他那样将依赖作为属性传递给bean的IOC风格,ApplicationContext的其他方法提供对文件资源的访问、发布应用程序事件和访问MessageResource。这些附加功能在ApplicationContext的附加功能中进行了描述。
在Spring2.5中,自动装配是获取ApplicationContext引用的另一个选择。传统”构造函数和byType自动装配模式(如自动装配组合中所述)可以分别为构造函数参数或setter方法参数提供ApplicationContext类型的依赖关系。为了获得更大的灵活性,包括自动装配字段和多个参数方法的能力,请使用新的基于注解的自动装配功能。如果执行此操作,则ApplicationContext将自动装配到需要ApplicationContext类型的字段、构造函数参数或方法参数中,前提是相关字段、构造函数或方法带有@Autowired注释。有关详细信息,请参阅使用@Autowired。
当ApplicationContext创建一个实现org.springframework.beans.factory.BeanNameaWare接口的类时,将向该类提供对其关联对象定义中定义的名称的引用。下面的列表显示了BeanNameaWare接口的定义:
public interface BeanNameAware {
void setBeanName(String name) throws BeansException;
}
该方法会在在填充普通bean属性之后,但在初始化回调(如Initializingbean、afterPropertieSset或自定义init-method)之前调用回调。除了ApplicationContextAware和BeanNameAware(前面讨论过)之外,Spring还提供了一系列Aware回调接口,让bean向容器表明它们需要某种基础结构依赖性。作为一般规则,名称指示依赖项类型。下表总结了最重要的Aware接口:
Name |
依赖注入 |
ApplicationContextAware |
声明 ApplicationContext |
ApplicationEventPublishAware |
封装ApplicationContext的事件发布 |
BeanClassLoaderAware |
用于加载bean类的类加载器 |
BeanFactoryAware |
声明一个BeanFactory |
BeanNameAware |
声明bean的名称 |
BootstrapContextAware |
容器运行的资源适配器BootstrapContext。通常仅在支持JCA的ApplicationContext 实例中可用。 |
LoadTimeWeaverAware |
在加载时为处理类定义定义定义的weaver。 |
MessageSourceAware |
用于解析消息的配置策略(支持参数化和国际化) |
NotificationPublisherAware |
Spring JMX 通知发布 |
ResourceLoaderAware |
为资源的低级访问配置了加载程序。 |
ServletConfigAware |
容器运行的当前Servletconfig。仅在web-aware的SpringApplicationContext中有效。 |
ServletContectAware |
容器运行的当前ServletContext容器。仅在web-aware的SpringApplicationContext中有效。 |
Spring提供了很多Aware接口,如上表格所示,这些Aware到底有什么用处呢?下面讲解Aware的用处,Aware的提供是为了我们能够使用Spring内部提供的一些接口或者类的功能。我们以ApplicationContextAware为例,如果我们想要使用ApplicationContext我们可以在定义的类实现ApplicationContextAware接口,代码如下:
@Component
public class ApplicationContextAwareBean implements ApplicationContextAware {
//ApplicationContext实例会在ApplicationContextAwareBean 实例化时通过
//下面的setApplicationContext方法赋值
//我们在该类可以使用ApplicationContext实例提供的任何功能
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
除了ApplicationContextAware,我们还可以实现ApplicationEventPublisherAware接口,该接口会设置ApplicationEventPublisher 实例,代码如下,我们可以通过ApplicationEventPublisher 实例发布事件,具体使用可以参考博客Spring 中时事件处理机制——ApplicationEvent一篇。
public interface ApplicationEventPublisherAware extends Aware {
void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher);
}
推荐阅读
-
Spring中的InitializingBean接口的使用
-
Spring中property-placeholder的使用与解析详解
-
Spring中的InitializingBean接口的使用
-
C#中抽象类和接口的区别与使用
-
Spring中的Aware接口的使用——ApplicationContextAware与BeanNameAware
-
Spring中的ApplicationContextAware使用
-
spring 中 bean的初使用+bean的继承+bean调用前与调用后的调用
-
Spring整合Struts2中拦截链与注解的使用
-
java中的接口定义与使用
-
C#中抽象类和接口的区别与使用