1. 程式人生 > >Spring之Bean實現了ApplicationContextAware等aware介面,對於setApplicationContext方法執行時間點的說明

Spring之Bean實現了ApplicationContextAware等aware介面,對於setApplicationContext方法執行時間點的說明

  在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); } }
}
示例呼叫序列圖: