ApplicationContext的一系列aware回调接口,是通过实现BeanPostProcessor来实现的,当bean工厂启动后实力化BEAN就会回调这一系列的aware接口
可以看到所有的aware接口统统在此处回调,哪这个类到底在哪里会被调用呢?
在AbstractAutowireCapableBeanFactory里面
方法如下:
这里是总的入口,但是ApplicationContextAwareProcessor的实例是什么时候到AbstractAutowireCapableBeanFactory的getBeanPostProcessors返回的集合里面的呢?
答案还得回到AbstractApplicationContext类里面
在这里就将该实例该ApplicationContextAwareProcessor实例绑定到了beanFactory上了,所以当beanfactory回调beanPostProcess接口的时候,就可以执行这里面的postProcessBeforeInitialization方法了。
class ApplicationContextAwareProcessor implements BeanPostProcessor {
//当bean实例化之前,会调用此方法对bean进行处理
这是官方的解释:
Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean * initialization callbacks (like InitializingBean's <code>afterPropertiesSet</code> * or a custom init-method)
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
AccessControlContext acc = null;
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 (acc != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
invokeAwareInterfaces(bean);
return null;
}
}, acc);
}
else {
invokeAwareInterfaces(bean);
}
return bean;
}
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(
new EmbeddedValueResolver(this.applicationContext.getBeanFactory()));
}
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);
}
}
}
}
可以看到所有的aware接口统统在此处回调,哪这个类到底在哪里会被调用呢?
在AbstractAutowireCapableBeanFactory里面
方法如下:
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
if (result == null) {
return result;
}
}
return result;
}
这里是总的入口,但是ApplicationContextAwareProcessor的实例是什么时候到AbstractAutowireCapableBeanFactory的getBeanPostProcessors返回的集合里面的呢?
答案还得回到AbstractApplicationContext类里面
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
//此处就是调用的地方
prepareBeanFactory(beanFactory);
.....................................................
}
实现为:
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
.............省略其他的代码...........
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
.............省略其他的代码...........
}
在这里就将该实例该ApplicationContextAwareProcessor实例绑定到了beanFactory上了,所以当beanfactory回调beanPostProcess接口的时候,就可以执行这里面的postProcessBeforeInitialization方法了。