欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring中的Aware接口的使用——ApplicationContextAware与BeanNameAware

程序员文章站 2022-05-25 16:32:33
...

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