Spring ApplicationContext下的一连串aware接口的调用
Spring ApplicationContext下的一系列aware接口的调用
ApplicationContext的一系列aware回调接口,是通过实现BeanPostProcessor来实现的,当bean工厂启动后实力化BEAN就会回调这一系列的aware接口
可以看到所有的aware接口统统在此处回调,哪这个类到底在哪里会被调用呢?
在AbstractAutowireCapableBeanFactory里面
方法如下:
这里是总的入口,但是ApplicationContextAwareProcessor的实例是什么时候到AbstractAutowireCapableBeanFactory的getBeanPostProcessors返回的集合里面的呢?
答案还得回到AbstractApplicationContext类里面
在这里就将该实例该ApplicationContextAwareProcessor实例绑定到了beanFactory上了,所以当beanfactory回调beanPostProcess接口的时候,就可以执行这里面的postProcessBeforeInitialization方法了。
ApplicationContext的一系列aware回调接口,是通过实现BeanPostProcessor来实现的,当bean工厂启动后实力化BEAN就会回调这一系列的aware接口
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方法了。