Aware Aware 是 Spring 中的一个根接口,继承该接口的子接口有很多,但是该接口没有任何方法,所以大家可以把它理解成一个标记接口: Spring框架中提供了许多实现了Aware接口的类,这
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 接口的使用方法以此类推。
参考: https://zhuanlan.zhihu.com/p/68877265