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);
}

猜你喜欢

转载自blog.csdn.net/wk19920726/article/details/108740755
今日推荐