ApplicationContextAware如何装配applicationcontext

首先看通过实现ApplicationContextAware接口获得applicationcontext的方法:

@Component
public class SpringContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext; // Spring应用上下文环境  

    public void setApplicationContext(ApplicationContext applicationContext)  
            throws BeansException {  
        SpringContextUtil.applicationContext = applicationContext;  
    }  
    public static ApplicationContext getApplicationContext() {  
        return applicationContext;  
    }
}

要知道ApplicationContextAware首先要了解ApplicationContextAwareProcessor
ApplicationContextAwareProcessor继承了BeanPostProcessor,即在bean实例化的时候会调用postProcessBeforeInitialization

//bean实例化后的回调
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		// TODO Auto-generated method stub
		return null;
	}

而ApplicationContextAwareProcessor的postProcessBeforeInitialization方法中

if (System.getSecurityManager() != null &&
				(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
						bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
						bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {
			acc = this.applicationContext.getBeanFactory().getAccessControlContext();
		}
if (bean instanceof ApplicationContextAware) {
				((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
			}

如果bean是ApplicationContextAware子类就会把当前spring的上下文设置给bean,所以bean继承ApplicationContextAware就能通过setApplicationContext得到当前Spring上下文
类似的处理:
ApplicationContextAware如何装配applicationcontext_第1张图片

你可能感兴趣的:(Spring源码,Spring)