在Spring中,如果Bean对象实现了ApplicationContextAware接口,则Spring在完成Bean的初始化后,会将ApplicationContext上下文对象注入至该Bean对象中,注入方法为调用Bean的setApplicationContext方法,如:
public class BeanAwareTest implement ApplicationContextAware {
private static ApplicationContext applicationContext;public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolder.applicationContext = applicationContext;
}
}
那么上面的setApplicationContext方法是什么时间被执行的呢?
我们通过对spring源码进行追踪,发现AbstractApplicationContext类中的prepareBeanFactory方法有一句
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
该方法中涉及一个类ApplicationContextAwareProcessor,该类中有初始化方法
postProcessBeforeInitialization中有一句this.invokeAwareInterfaces(bean),
而invokeAwareInterfaces方法的代码如下:
示例调用序列图: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(this.embeddedValueResolver); } 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); } }}