美文网首页
Spring5IOC容器解析——Aware接口

Spring5IOC容器解析——Aware接口

作者: 小波同学 | 来源:发表于2020-06-15 02:02 被阅读0次

    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

    相关文章

      网友评论

          本文标题:Spring5IOC容器解析——Aware接口

          本文链接:https://www.haomeiwen.com/subject/kbbqxktx.html