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实现
- 定义Aware子接口,并定义回调方法:
/**
* @author zhw
* @description
* @date 2021-10-19 10:03
*/
public interface MyBeanAware extends Aware {
void setBeanInfo(String info);
}
- 实现自定义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;
}
}
- 自定义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;
}
}
- 测试类
@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 版权协议,转载请附上原文出处链接和本声明。