我们知道在WebApplicationContext初始化的时候需要进行Refresh操作,即调用refresh方法。
wac.refresh();
在这个过程中会对BeanFactory进行刷新。
// Tell the subclass to refresh the internal bean factory.告诉其子类刷新内部的bean factory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
refreshBeanFactory();//刷新BeanFactory,会进行新建操作
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (logger.isDebugEnabled()) {
logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
}
return beanFactory;
}
@Override
protected final void refreshBeanFactory() throws BeansException {
if (hasBeanFactory()) {//如果存在beanFactory则销毁并关闭
destroyBeans();
closeBeanFactory();
}
try {
DefaultListableBeanFactory beanFactory = createBeanFactory();//创建一个新的beanFactory
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
loadBeanDefinitions(beanFactory);//通过beanFactory加载beanDefinition
synchronized (this.beanFactoryMonitor) {
this.beanFactory = beanFactory;//对beanFactory进行重新赋值。
}
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}
protected DefaultListableBeanFactory createBeanFactory() {//传入这个context的父context内部的beanFactory
return new DefaultListableBeanFactory(getInternalParentBeanFactory());//由此可见这个context内部的beanFacotry
}