Spring架構詳解之BeanFactory的建立-上
阿新 • • 發佈:2019-01-10
下面是更新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,這個非常關鍵,因為他設計到後面對這個物件的多種操作,下面看一下這個類的繼承層次類圖:
從這個圖中發現除了BeanFactory相關的類外,還發現了與Bean的register相關。這在refreshBeanFactory方法中有一行loadBeanDefinitions(beanFactory)將找到答案,這個方法將開始載入、解析 Bean的定義,也就是把使用者定義的資料結構轉化為Ioc容器中的特定資料結構。
這個過程可以用下面時序圖解釋:
建立BeanFactory時序圖