欢迎关注公众号 《小姐姐味道》 ,一起进步!

# spring中,以 Aware结尾的类,都是干什么用的?能举例说明么?

死磕面试系列。

标签:【初级】【Spring】

在我们平常的编码中,如果你使用Spring,会发现大量以Aware结尾的类。它们有什么规律么?面试官想从中获取些什么?

# 1. 问

spring中,以 Aware结尾的类,都是干什么用的?能举例说明么?

# 2. 解析

题目用于考察面试者的基础编码能力和总结能力。本题目属于初级定位,因为ApplicationContextAware的使用频率很高,使用Spring就一定会遇到。

# 3. 答

Aware就是感知的意思,一般以该单词结尾的类,都实现了Aware接口, Aware 的目的是为了让bean获取spring容器的服务。具体回调方法由子类实现,比如ApplicationContextAware。

# 4. 扩展

要搞明白这个问题,我们只需要了解Spring的Bean生命周期就可以了。

Bean生命周期分为初始化和销毁两个部分。当然,在每一个部分,都可以做一些Hook,比如常用的InitializingBean,DisposableBean等。当然,Aware也不例外。

spring 提供的aware的接口:

1)BeanNameAware :可以获取容器中bean的名称

void setBeanName(String name);

2)BeanFactoryAware : 获取当前bean factory这也可以调用容器的服务

void setBeanFactory(BeanFactory beanFactory) 
throws BeansException;

3)ApplicationContextAware: 当前的applicationContext, 这也可以调用容器的服务

void setApplicationContext(ApplicationContext applicationContext) 
throws BeansException;

4) MessageSourceAware:获得message source,这也可以获得文本信息

void setMessageSource(MessageSource messageSource);

5)ResourceLoaderAware: 获得资源加载器,可以获得外部资源文件的内容

void setResourceLoader(ResourceLoader resourceLoader);

还有很多,不一一列举。最常用的就是ApplicationContextAware,几乎每个项目都有一个。

ApplicationContextAware可以获取到spring的上下文,再由此获得相关的bean,这也是获取注入bean的一种方法,在某些无法autowired的情况下使用。

-w733 这会打乱Spring的注入体系,应该有限度使用。

典型代码如下:

@Component
public class SpringContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        applicationContext = ctx;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static <T> T getBean(Class<T> cls) {
        return applicationContext.getBean(cls);
    }
}

这里使用静态字段注入,用的时候难受,就好像如鲠在喉似的。

这么常用的一个工具类,为什么Spring不默认提供一个呢?而要开发者都搞这样一个又脏又臭的类?

Spring还真的默认提供了一个,不过必须是web项目,使用下面的代码即可获取Context。

org.springframework.web.context.WebApplicationContext
.getCurrentWebApplicationContext();

扯远了。平常的编码中还是要注意这些命名上的规律。

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,​进一步交流。​

http://xjjdog.cn 对200+原创文章进行了细致的分类,阅读更流畅,欢迎收藏。


关注回复 技术 关键字 ,即可 获取 海量资源

鲁ICP备2020043359号-1