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