您的位置:首页 > 移动开发

Spring之Bean实现了ApplicationContextAware等aware接口,对于setApplicationContext方法执行时间点的说明

2017-07-05 11:32 1551 查看
  在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);
}
}
}
示例调用序列图:

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐