Spring5IOC容器解析——Aware接口

Aware

Aware 是 Spring 中的一個根接口,繼承該接口的子接口有很多,但是該接口沒有任何方法,所以大家可以把它理解成一個標記接口:

Spring框架中提供了許多實現(xiàn)了Aware接口的類,這些類主要是為了輔助Spring訪問容器中的數(shù)據(jù),比如BeanNameAware,這個類能夠在Spring容器加載的過程中將Bean的名字(id)賦值給變量。

Spring Aware實現(xiàn)關(guān)系:


Spring Aware 以下是幾個常用的接口:

  • 1、ApplicationContextAware:能獲取Application Context調(diào)用容器的服務
  • 2、BeanNameAware:提供對BeanName進行操作
  • 3、ApplicationEventPublisherAware:主要用于事件的發(fā)布
  • 4、BeanClassLoadAware:相關(guān)的類加載器
  • 5、BeanFactoryAware:聲明BeanFactory的
  • 6、MessageSourceAware:獲取MessageSource
  • 7、ResourceLoaderAware:獲取資源加載器,可以獲得外部資源文件

ApplicationContextAware

ApplicationContext可以獲取容器中的bean,但是必須注入才能使用,當一些類不能注入的時候怎么才能獲得bean呢?比如Utils中的類,通常不能直接通過注入直接使用ApplicationContext,此時就需要借助ApplicationContextAware這個接口了。

ApplicationContextAware的實現(xiàn)類如下

/**
 * @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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容