obtainFreshBeanFactory方法的作用是告诉子类刷新内部bean工厂。

1
2
3
4
5
6
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
//刷新bean工厂,这里使用了子类AbstractRefreshableApplicationContext中的实现
refreshBeanFactory();
//获取bean工厂
return getBeanFactory();
}

这里refreshBeanFactory()方法由子类AbstractRefreshableApplicationContext实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Override
protected final void refreshBeanFactory() throws BeansException {
//如果已经持有一个BeanFactory
if (hasBeanFactory()) {
//用于销毁此上下文管理的所有bean
destroyBeans();
//关闭持有的BeanFactory
closeBeanFactory();
}
try {
//新建一个 DefaultListableBeanFactory
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
// 自定义此上下文使用的内部bean工厂。
// allowBeanDefinitionOverriding
// allowCircularReferences
customizeBeanFactory(beanFactory);
//加载BeanDefinitions
loadBeanDefinitions(beanFactory);
synchronized (this.beanFactoryMonitor) {
this.beanFactory = beanFactory;
}
} catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}

核心方法loadBeanDefinitions,从配置文件中加载bean的定义,看AbstractXmlApplicationContext中的实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//通过XmlBeanDefinitionReader加载bean定义。
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
// Create a new XmlBeanDefinitionReader for the given BeanFactory.
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

// Configure the bean definition reader with this context's
// resource loading environment.
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

// Allow a subclass to provide custom initialization of the reader,
// then proceed with actually loading the bean definitions.
initBeanDefinitionReader(beanDefinitionReader);
loadBeanDefinitions(beanDefinitionReader);
}

tencent.jpg