ApplicationContext.1 obtainFreshBeanFactory解析

75 阅读1分钟

作用

创建beanFactory设置一些配置项,配置QualifierAnnotationAutowireCandidateResolver(不知道为什么不用InstantiationAwareBeanPostProcessor),加载BeanDefinition

简单来说就是创建并配置beanFactory,并加载BeanDefinition.

代码解析

/*--AbstractApplicationContext--*/
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
    //主要方法,销毁原BeanFactory,创建并加载BeanFactory。
	refreshBeanFactory();
	//简单返回beanFactory变量
	ConfigurableListableBeanFactory beanFactory = getBeanFactory();
	if (logger.isDebugEnabled()) {
		logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
	}
	return beanFactory;
}

/*--AbstractRefreshableApplicationContext--**/

protected final void refreshBeanFactory() throws BeansException {
	if (hasBeanFactory()) {
		destroyBeans();
		closeBeanFactory();
	}
	try {
		//简单new一个DefaultListableBeanFactory,并设置一个父beanFactory
		DefaultListableBeanFactory beanFactory = createBeanFactory();
		beanFactory.setSerializationId(getId());
		//配置一些BeanDefinition加载相关的配置项
		//交由子类实现BeanDefinition的加载,不同的子类加载方式不同,例如xml配置的和注解配置(不继承该类。单独实现一套)的就不一样,
		//参考AbstractXmlApplicationContext和AnnotationConfigWebApplicationContext的实现
		loadBeanDefinitions(beanFactory);
		synchronized (this.beanFactoryMonitor) {
			this.beanFactory = beanFactory;
		}
	}
	catch (IOException ex) {
		throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
	}
}

/**--org.springframework.context.support.AbstractRefreshableApplicationContext#customizeBeanFactory--**/

protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
	if (this.allowBeanDefinitionOverriding != null) {
		beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
	}
	if (this.allowCircularReferences != null) {
		beanFactory.setAllowCircularReferences(this.allowCircularReferences);
	}
	beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
}