AnnotationConfigApplicationContext-obtainFreshBeanFactory
obtainFreshBeanFactory
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
// 刷新【创建】BeanFactory
refreshBeanFactory();
// 返回刚才GenericApplicationContext创建的BeanFactory对象
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (logger.isDebugEnabled()) {
logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
}
// 将创建的BeanFactory【DefaultListableBeanFactory】返回
return beanFactory;
}
refreshBeanFactory
AbstractRefreshableApplicationContext->refreshBeanFactory();
protected final void refreshBeanFactory() throws BeansException {
//判断是否已经存在BeanFactory,存在则销毁所有Beans,并且关闭BeanFactory.
//目的是避免重复加载BeanFactory
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
//创建具体的beanFactory,这里创建的是DefaultListableBeanFactory,最重要的beanFactory
//spring注册及加载bean就靠它。其实这里还是一个基本的容器
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
//扩展
customizeBeanFactory(beanFactory);
//初始化XmlBeanDefinitionReader用来读取xml,并加载解析
loadBeanDefinitions(beanFactory);
//设置为全局变量,AbstractRefreshableApplicationContext持有DefaultListableBeanFactory引用
synchronized (this.beanFactoryMonitor) {
this.beanFactory = beanFactory;
}
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}
此处的beanFactory,是在GenericApplicationContext这个类文件中,调用无参构造器,创建了一个DefaultListableBeanFactory
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}