Aware
Aware 是 Spring 中的一个根接口,继承该接口的子接口有很多,但是该接口没有任何方法,所以大家可以把它理解成一个标记接口:
Spring框架中提供了许多实现了Aware接口的类,这些类主要是为了辅助Spring访问容器中的数据,比如BeanNameAware,这个类能够在Spring容器加载的过程中将Bean的名字(id)赋值给变量。
Spring Aware实现关系:
Spring Aware 以下是几个常用的接口:
- 1、ApplicationContextAware:能获取Application Context调用容器的服务
- 2、BeanNameAware:提供对BeanName进行操作
- 3、ApplicationEventPublisherAware:主要用于事件的发布
- 4、BeanClassLoadAware:相关的类加载器
- 5、BeanFactoryAware:声明BeanFactory的
- 6、MessageSourceAware:获取MessageSource
- 7、ResourceLoaderAware:获取资源加载器,可以获得外部资源文件
ApplicationContextAware
ApplicationContext可以获取容器中的bean,但是必须注入才能使用,当一些类不能注入的时候怎么才能获得bean呢?比如Utils中的类,通常不能直接通过注入直接使用ApplicationContext,此时就需要借助ApplicationContextAware这个接口了。
ApplicationContextAware的实现类如下
/**
* @author: huangyibo
* @Date: 2019/10/25 23:48
* @Description: 提供手动获取被spring管理的bean对象
*/
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
}
// 获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
// 通过name获取 Bean.
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
// 通过class获取Bean.
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
// 通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
配置了如上的工具类,那么就可以直接使用SpringUtil获取ApplicationContext对象了,而不需要注入了,如下:
StringRedisTemplate redisTemplate=SpringUtil.getBean("stringRedisTemplate",StringRedisTemplate.class);
SpringBoot整合Netty框架的时候,如果在Netty中的自定义Handler中要使用到Spring中的Bean的时候,因为无法直接将Bean注入到Netty中,所以就可以使用ApplicationContextAware接口了。
其他Spring Aware 接口的使用方法以此类推。