Spring学习笔记(四) Aware接口

1. 引子

在Spring源码学习的时候经常会看到各种各样以Aware结尾的接口,那这些接口是干嘛用的呢。今天就来学习一下。

2. Aware接口

Spring容器在启动的时候,会自动识别哪些类实现了Aware相关接口,然后将这些Aware接口对应的实例自动注入。Aware接口的子接口有很多:

Spring学习笔记(四) Aware接口_第1张图片
image

下面以ApplicationContextAware为例,看下用法。

2.1 示例

我们之前如果想通过容器获取指定的类的实例,是这样写的:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(...);

Test test = applicationContext.getBean("Test");

这种写法的缺点是每次都要自己new一个ApplicationContext,并且给不清楚Spring的人来说有点难以理解。

为此下面示例来对这个逻辑进行封装,定义一个名为SpringFactory的工具类。

首先新建一个类实现该接口:

public class SpringFactory implements ApplicationContextAware {
  
  private ApplicationContext applicationContext;
  
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
  }
  
  public static  T getBean(Class clazz) {
    T result = null;

    String[] names = applicationContext.getBeanNamesForType(clazz);
    if(names != null && names.length>0){
      result = (T)applicationContext.getBean(names[0]);
    }

    return  result;
  }
  
}

定义好该类后就可以直接通过它获取指定类的实例了:

public void test(){
    Test test = SpringFactory.getBean(Test.class);
  test.xxx(); // 方法调用
}

从示例可以看出,上述代码并没有显式的对成员变量applicationContext进行赋值,那applicationContext不应该是null吗,实际执行却没有报错,这就是ApplicationContextAware的作用了。因为Spring容器启动的时候,扫描到SpringFactory这个类实现了ApplicationContextAware这个接口,然后就会自动将ApplicationContext接口的实例注入到该类中,所以要用的时候就不是空了。

你可能感兴趣的:(Spring学习笔记(四) Aware接口)