作用
创建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());
}