前言
我们在学习 spring 源码时会经常看到Aware这个东西,这是啥东西呢?有啥作用呢?
比如:ApplicationContextAware、BeanFactoryAware等。
Aware
在Spring框架中,Aware
是一组接口,它们被称为Aware
接口,因为它们可以使Bean"感知"到Spring容器的某些特性。这些接口通常以Aware
结尾,例如ApplicationContextAware
,BeanFactoryAware
等。
当一个类实现了某个Aware
接口时,Spring在创建这个类的Bean实例时,会自动调用相应的set
方法,将相关的对象注入到这个Bean中。这样,这个Bean就可以在其内部使用这些对象了。
例如,如果一个类实现了ApplicationContextAware
接口,那么Spring会在创建这个类的Bean实例时,自动调用setApplicationContext
方法,将ApplicationContext
对象注入到这个Bean中。这样,这个Bean就可以在其内部使用ApplicationContext
对象了。
java
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class MyBean implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void doSomething() {
// 在这里,我们可以使用applicationContext对象
// 例如,获取其他的Bean
OtherBean otherBean = applicationContext.getBean(OtherBean.class);
otherBean.performTask();
}
}
这就是Aware
接口的基本作用:它们可以使Bean"感知"到Spring容器的某些特性,从而在Bean内部使用这些特性。这句话什么意思?
这句话的意思是,通过实现Aware接口,Bean可以获取到Spring容器中的一些对象或者信息,然后在Bean的内部使用这些对象或者信息。
- 如上面的例子,如果一个Bean实现了
ApplicationContextAware
接口,那么这个Bean就可以"感知"到Spring容器的ApplicationContext
对象。 - Spring在创建MyBean这个Bean的实例时,会自动调用
setApplicationContext
方法,将ApplicationContext
对象注入到这个Bean中。这样,这个Bean就可以在其内部使用ApplicationContext
对象了,例如,它可以通过ApplicationContext
对象获取到其他的Bean。
这就是所谓的"感知":Bean通过实现Aware
接口,可以获取到Spring容器中的一些对象或者信息,然后在其内部使用这些对象或者信息。这种机制使得Bean可以更加灵活地与Spring容器和其他Bean交互。
总结
然而,虽然Aware
接口非常强大,但它们也有一些缺点。最主要的缺点是,使用Aware
接口会使你的代码与Spring框架紧密耦合,这可能会影响代码的可测试性和可移植性。
Aware接口是Spring设计为框架内部使用的,因此,除非必要,否则不建议在你的代码中直接使用这些Aware
接口。在大多数情况下,你可以使用Spring的依赖注入功能来获取和操作Bean,而无需直接使用Aware
接口。这种方式更符合依赖注入的原则,可以使你的代码更加松耦合,更易于测试和移植。