下面是更新BeanFactory的方法代码:
|
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
27
28
29
30
31
32
33
34
35
36
37
38
39
|
protected
final
void
refreshBeanFactory() throws
BeansException { if
(hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try
{ DefaultListableBeanFactory
beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); loadBeanDefinitions(beanFactory); synchronized
(this.beanFactoryMonitor)
{ this.beanFactory
= beanFactory; } } catch
(IOException ex) { throw
new
ApplicationContextException( "I/O
error& nbsp;parsing bean definition source for " +
getDisplayName (), ex); } } |
这个方法实现了AbstractApplicationContext的抽象方法refreshBeanFactory,这段代码清楚的说明了BeanFactory的创建过程。注意BeanFactory对象的类型的变化,前面介绍了他有很多子类,在什么情况下使用不同的子类这非常关键。BeanFactory的原始对象是DefaultListableBeanFactory,这个非常关键,因为他设计到后面对这个对象的多种操作,下面看一下这个类的继承层次类图:

DefaultListableBeanFactory类继承关系图
从这个图中发现除了BeanFactory相关的类外,还发现了与Bean的register相关。这在refreshBeanFactory方法中有一行loadBeanDefinitions(beanFactory)将找到答案,这个方法将开始加载、解析 Bean的定义,也就是把用户定义的数据结构转化为Ioc容器中的特定数据结构。
这个过程可以用下面时序图解释:

创建BeanFactory时序图
本文详细解析了AbstractApplicationContext中refreshBeanFactory方法的实现细节,包括BeanFactory的创建过程、Bean定义的加载与解析流程。
1472

被折叠的 条评论
为什么被折叠?



