obtainFreshBeanFactory()
进入方法
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
//初始化bean工厂并赋值给AbstractRefreshableApplicationContext
refreshBeanFactory();
//调用AbstractRefreshableApplicationContext的getBeanFactory方法返回DefaultListableBeanFactory
//DefaultListableBeanFactory实现了ConfigurableListableBeanFactory接口
return getBeanFactory();
}
在进入refreshBeanFactory方法
@Override
protected final void refreshBeanFactory() throws BeansException {
//判断beanFactory是否为空,如果存在则先销毁、关闭该 BeanFactory
if (hasBeanFactory()) {
destroyBeans();
closeBeanFactory();
}
try {
//初始化一个DefaultListableBeanFactory
DefaultListableBeanFactory beanFactory = createBeanFactory();
//给beanfactroy设置SerializationId为下面那样
// 如org.springframework.context.support.ClassPathXmlApplicationContext@17f6480
beanFactory.setSerializationId(getId());
//因为这个类里面的属性都为空实际上没做什么
customizeBeanFactory(beanFactory);
//加载BeanDefinition到beanfactroy
loadBeanDefinitions(beanFactory);
synchronized (this.beanFactoryMonitor) {
//设置beanfactroy
this.beanFactory = beanFactory;
}
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}
进入createBeanFactory
protected DefaultListableBeanFactory createBeanFactory() {
//getInternalParentBeanFactory返回一个null的beanfactroy
//new一个DefaultListableBeanFactory把beanfactroy设置给他的父类AbstractBeanFactory
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
new DefaultListableBeanFactory(getInternalParentBeanFactory());最后会把beanfactory注入到AbstractBeanFactory在代码如下
@Override
public void setParentBeanFactory(@Nullable BeanFactory parentBeanFactory) {
if (this.parentBeanFactory != null && this.parentBeanFactory != parentBeanFactory) {
throw new IllegalStateException("Already associated with parent BeanFactory: " + this.parentBeanFactory);
}
this.parentBeanFactory = parentBeanFactory;
}
创建好后设置到AbstractRefreshableApplicationContext的成员属性beanFactory中
下一篇解析loadBeanDefinitions(beanFactory);这个方法主要是解析xml并把bean封装成BeanDefinition注入到beanfactory中