概述
Spring中Aware到底是什么意思?
我们在看Spring源码的时候,经常可以看到xxxAwarexxx的身影,通常我会很疑惑,Aware到底是什么意思呢?
比如图片中这些包含Aware关键字的类或者接口。
我对下面3个类或接口进行了解释,来体会下aware的含义。
ApplicationContextAwareProcessor:可识别应用上下文的处理器。
BeanFactoryAware:实现BeanFactoryAware接口的Bean希望意识到BeanFactory。
EnvironmentAware:任何实现了EnvironmentAware接口的bean希望去被通知当Environment运行的时候。
aware本身的意思是“知道的,明白的;察觉到的,意识到的;有……意识的,有……知识的”,结合上面的类型或接口的解释,个人认为spring中aware的意思是“可识别的,可意识的”。
因此再碰到包含Aware关键字的接口或类时,我们可以把它理解成,这个类或实现了该接口的bean都是可以识别xxx的。
那问题来了,识别什么呢?个人认为, 应该是可以识别Aware形容的组件。
比如ApplicationContextAwareProcessor是指可识别应用上下文的处理器。
BeanFactoryAware是指可以被识别的beanFactory,因此所有实现了BeanFactoryAware的bean都是能够识别BeanFactory,就是可以识别BeanFactory的bean。
Aware的作用
Spring 的依赖注入最大亮点就是所有的Bean对Spring容器的存在是没有意识的(感知不到Spring容器的存在)。
在实际项目中,我们不可避免的要用到Spring容器本身提供的资源,这时候要让Bean主动意识到Spring容器的存在,才能调用Spring所提供的资源,这就是Spring Aware。其实 Spring Aware是被Spring设计为框架内部使用的,若使用了,你的 Bean将会和Spring框架耦合,所以自己不单独使用。
通常使用 Spring Aware的目的是为了让 Bean获得Spring容器的服务。
在大多数情况下,我们应该避免使用任何 Aware 接口,除非我们需要它们。实现这些接口会将代码耦合到Spring框架,但是希望看过本博客内容之后阅读框架源码不再迷惑。
Aware使用示例
下面是一个实现BeanFactoryAware、ApplicationContextAware接口,获取BeanFactory、ApplicationContext的示例。
public class Person implements BeanFactoryAware, ApplicationContextAware {
private int id;
private ApplicationContext applicationContext;
private BeanFactory beanFactory;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public BeanFactory getBeanFactory() {
return beanFactory;
}
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
}
参考
Spring Aware 到底是什么?