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接口的类,会被后置处理器处理回调实现方法。
测试结果:
在这里插入图片描述


版权声明:本文为nianqrzhanghw原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/nianqrzhanghw/article/details/120840992