DefaultListableBeanFactory如何被实例化

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



猜你喜欢

转载自blog.csdn.net/u013828625/article/details/80334766