我们知道在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 }