写在前面
aware:英 [əˈweə®] 美 [əˈwer] adj.意识到的;知道的;觉察到的。
XXXAware在Spring里表示对XXX感知,当业务中实现XXXAware接口并且实现了对应的setXXX方法以后,就可以使用XXX的特性了。在某些特定的业务中需要获取一些在SpringBoot启动时的信息,也就是说有一些业务场景需要获取某些信息,而这些信息只有在SpringBoot各个生命周期中的各个阶段才能暴露出来,这时实现Aware接口就可以满足业务场景了。
Aware自身是一个空的接口,SpringBoot有很多Aware的实现接口,开发者实现这些已有的接口就能获取特定的信息。SpringBoot 提供了九大感知类接口:ApplicationContextAware、EnvironmentAware、ApplicationEventPublisherAware、BeanNameAware、BeanClassLoaderAware、BeanFactoryAware、EmbeddedValueResolverAware、ResourceLoaderAware、MessageSourceAware
使用场景
使用XXXAware可以让Bean获得Spring容器的服务,从而获取SpringBoot启动时的一些信息。
调用过程
如果某个Bean想要使用当前的 ApplicationContext,那么只需要让该Bean实现ApplicationContextAware接口,然后实现接口中唯一的方法void setApplicationContext(ApplicationContext var1) throws BeansException就可以了,Spring容器会自动调用这个回调方法将ApplicationContext 传给我们就可以了。
内置接口
序号 | 接口 | 说明 |
---|---|---|
1 | ApplicationContextAware | 获取当前应用的上下文对象 |
2 | EnvironmentAware | 获取系统变量和环境变量,包括业务配置的以及系统默认的属性信息 |
3 | ApplicationEventPublisherAware | 获取应用事件发布器,可以发布我们监听的事件 |
4 | BeanNameAware | 获取容器中的Bean的名称或者是ID |
5 | BeanClassLoaderAware | 获取Bean的类加载器 |
6 | BeanFactoryAware | 获取Bean的创建工厂对象,获取到这个工厂对象后可以使用BeanFactory提供大量功能 |
7 | EmbeddedValueResolverAware | 获取Spring容器加载的properties文件属性值 |
8 | ResourceLoaderAware | 获取资源加载器,可以加载特定业务需要的资源 |
9 | MessageSourceAware | 获取文本信息 ,解析消息 |
代码示例
@Slf4j
public class KieTemplate implements BeanClassLoaderAware {
...
private ClassLoader classLoader;
// SpringBoot会自动回调这个函数,将ApplicationContext对象传递给业务上下文,获取到这个实例可以做对应的处理
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
...
}
public class MyApplicationContext implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Optional.ofNullable(this.applicationContext).orElse(this.applicationContext = applicationContext);
}
public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
return applicationContext.getBean(name, requiredType);
}
}