Spring之Bean實現了ApplicationContextAware等aware介面,對於setApplicationContext方法執行時間點的說明
阿新 • • 發佈:2019-01-07
在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); } }}