在spring启动刷新的时候,会有一个准备工作也就是prepareBeanFactory方法,里面会添加BeanPostProcessor,也就是本文要说的ApplicationContextAwareProcessor
prepareBeanFactory(beanFactory);
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
....
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
....
}
ApplicationContextAwareProcessor实现了BeanPostProcessor接口,所以在Bean实例化的前后会调用BeanPostProcessor的postProcessBeforeInitialization和postProcessAfterInitialization方法,ApplicationContextAwareProcessor中也会有这两个方法源码实例
ApplicationContextAwareProcessor会处理下面几种接口的实现类
1. EnvironmentAware
2. EmbeddedValueResolverAware
3. ResourceLoaderAware
4. ApplicationEventPublisherAware
5. MessageSourceAware
6. ApplicationContextAware
通过名字可以猜到大概,当我们实现上面的接口,就需要实现对应接口的方法,然后方法里面去拿到对应类的属性,比如ApplicationContextAware接口,需要重写setApplicationContext方法,就可以拿到ApplicationContext对象
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
比如实现MessageSourceAware接口,就需要重写setMessageSource方法,就可以拿到messageSource对象,我们就可以把这个参数保存起来,在需要的时候,就可以通过全局变量的方式去拿到这个属性。
@Override
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
那么ApplicationContextAwareProcessor是怎么做到的,其实在Bean实例化的时候,每个Bean就会执行所有的BeanPostProcess的回调,也包括本文的ApplicationContextAwareProcessor类型,下面看下ApplicationContextAwareProcessor回调会做什么
class ApplicationContextAwareProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
.....
invokeAwareInterfaces(bean);
.....
return bean;
}
//判断bean的类型,再通过类型调用该类型所对应的重写方法
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof Aware) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(
new EmbeddedValueResolver(this.applicationContext.getBeanFactory()));
}
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
}
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
}
if (bean instanceof MessageSourceAware) {
((MessageSourceAware) bean).setMessageSource(this.applicationContext);
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
}
}
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
}