Aware接口源码分析

Spring中定义了Aware接口,该接口并未定义方法。该接口更多的是一个标记的作用,具体方法由子类去定义和实现。

Spring内置的许多类都实现了该接口:

以ApplicationContextAware为例:

ApplicationContextAware接口定义了一个设置应用上下文的方法。该接口的实现类实现该方法,可以做对上下文处理的逻辑。该aware还要对应一个BeanPostProcessor才能生效。
Spring中内置了一个ApplicationContextAwareProcessor的后置处理器来处理,在BeanPostProcessor中会检查bean是否实现Aware接口,然后调用回调方法:

其处理方法:


这里会调用很多Aware实现类的回调接口,完成Aware的功能实现。

Aware可以用来干什么?

使用Aware机制对Bean实现方法回调进行扩展。在Spring中ApplicationContextAware定义了setApplicationContext方法,并在ApplicationContextAwareProcessor中对其实现类进行回调,完成对bean设置上下文的功能。我们也可以自定义Aware和BeanPostProcessor回调方法,进行扩展。下面有个自定义Aware例子。

自定义Aware demo实现

  1. 定义Aware子接口,并定义回调方法:
/** * @author zhw * @description * @date 2021-10-19 10:03 */
public interface MyBeanAware extends Aware {
   
    void setBeanInfo(String info);
}
  1. 实现自定义Aware接口:
/** * @author zhw * @description * @date 2021-10-19 10:07 */
@Service
public class BeanDemo implements MyBeanAware{
   
    private String beanInfo;
    public String getBeanInfo() {
   
        return beanInfo;
    }

    @Override
    public void setBeanInfo(String info) {
   
        this.beanInfo = info;
    }
}
  1. 自定义BeanPostProcessor处理自定义Aware
/** * @author zhw * @description * @date 2021-10-19 10:01 */
@Component
public class AwareBeanPostProcessor implements BeanPostProcessor {
   
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
   
    	//判断bean是否实现Aware
        if (bean instanceof Aware) {
   
        	//判断是否实现MyBeanAware
            if (bean instanceof MyBeanAware) {
   
            	//进行回调
                ((MyBeanAware) bean).setBeanInfo("感知到该类!");
            }
        }
        return bean;
    }
}
  1. 测试类
@SpringBootApplication
public class AwareTest {
   
    public static void main(String[] args) {
   
        ConfigurableApplicationContext run = SpringApplication.run(AwareTest.class, args);
        BeanDemo bean = run.getBean(BeanDemo.class);
        System.out.println(bean.getBeanInfo());
    }
}

实现MyAware接口的类,会被后置处理器处理回调实现方法。
测试结果: