結合《spring技術內幕:深入解析spring架構與設計原理》這本書開啟spring學習之路。
ps:之前其實已經看過一部分了,但是也就是看過,一看而過了。o(╯□╰)o
//物件初始化時候 呼叫refresh(),啟動了beandifinition載入過程
throws bean***ception
}
refresh()方法的實現:
@override
public void refresh() throws bean***ception, illegalstateexception
catch (bean***ception ex)
finally
} }
ioc容器的啟動,蘊含了beandefinition的resource定位,載入,註冊等三個過程
@override
protected final void refreshbeanfactory() throws bean***ception
try
} catch (ioexception ex)
}
@override
protected void loadbeandefinitions(defaultlistablebeanfactory beanfactory) throws bean***ception, ioexception
可以看到 這裡建立了xmlbeandefinitionreader 設定到beanfactory 為reader配置resourceloader
接著就是loadbeandefinitions呼叫地方
protected void loadbeandefinitions(xmlbeandefinitionreader reader) throws bean***ception, ioexception
string configlocations = getconfiglocations();
if (configlocations != null)
}
呼叫了reader也就是 xmlbeandefinitionreader 的 loadbeandefinitions方法
public int loadbeandefinitions(encodedresource encodedresource) throws beandefinitionstoreexception
setcurrentresources = this.resourcescurrentlybeingloaded.get();
if (currentresources == null)
if (!currentresources.add(encodedresource))
try
return doloadbeandefinitions(inputsource, encodedresource.getresource());
}finally
} catch (ioexception ex)
finally
} }
具體讀取過程 在doloadbeandefinitions中實現
protected int doloadbeandefinitions(inputsource inputsource, resource resource)
throws beandefinitionstoreexception
catch (beandefinitionstoreexception ex)
catch (saxparseexception ex)
catch (saxexception ex)
catch (parserconfigurationexception ex)
catch (ioexception ex)
catch (throwable ex)
}
我們重點關注 registerbeandefinitions方法的具體實現
public int registerbeandefinitions(document doc, resource resource) throws beandefinitionstoreexception
這裡呼叫上面提到 documentreader 對應的registerbeandefinitions方法
public void registerbeandefinitions(document doc, xmlreadercontext readercontext)
具體過程在doregisterbeandefinitions中實現
protected void doregisterbeandefinitions(element root)
return;}}
} preprocessxml(root);
parsebeandefinitions(root, this.delegate);
postprocessxml(root);
this.delegate = parent;
}
可以看到其中建立了bean定義資訊的解析**類 具體解析過程在 parsebeandefinitions中實現
protected void parsebeandefinitions(element root, beandefinitionparserdelegate delegate)
else }}
} else
}
預設解析元素方法 parsedefaultelement
private void parsedefaultelement(element ele, beandefinitionparserdelegate delegate)
else if (delegate.nodenameequals(ele, alias_element))
else if (delegate.nodenameequals(ele, bean_element))
else if (delegate.nodenameequals(ele, nested_beans_element))
}
可以看到通過if else 對元素型別進行區分 ,我們重點關注 bean標籤的解析過程
protected void processbeandefinition(element ele, beandefinitionparserdelegate delegate)
catch (beandefinitionstoreexception ex)
// send registration event.
getreadercontext().firecomponentregistered(new beancomponentdefinition(bdholder));
} }
這就是大體的載入過程
大體流程圖:
Spring原始碼學習(一)
人對神秘的東西即好奇又恐懼,好奇心使人想一 竟恐懼心又使人望而卻步,工作了那麼久對spring原始碼一直懷有這樣的心態,從來沒有下決心進行研讀,最近感覺壓力在攀公升,使自己不得不戰勝恐懼心,進行更深入的學習,希望自己的學習同樣也能給你小夥伴們帶來一絲靈感。接下來將更加一下小例子來跟讀一下原始碼的實現...
Spring原始碼學習(一) IoC
一直想抽空把spring原始碼拿來讀讀,但真正去做這件事的時候發現不簡單,spring發展這麼多年,它的規模已不是乙個一般的開源框 架所能比的,它的主要架構和流程不是非常清晰,很難抓到要害,但有一點可以肯定,它的根基是ioc和aop,所有的功能擴充套件和對其他開源框架的支援都是基 於這兩點來做的,因...
Spring原始碼學習(一) IoC
一直想抽空把spring原始碼拿來讀讀,但真正去做這件事的時候發現不簡單,spring發展這麼多年,它的規模已不是乙個一般的開源框架所能比的,它的主要架構和流程不是非常清晰,很難抓到要害,但有一點可以肯定,它的根基是ioc和aop,所有的功能擴充套件和對其他開源框架的支援都是基於這兩點來做的,因此要...