【Drogon】框架是如何幫我們讀取配置文件的
目前出了一些Drogon框架的視頻,視頻的內(nèi)容更多的偏向于使用,并沒(méi)有過(guò)多的涉及到源碼,我打算用專(zhuān)欄的形式來(lái)解讀一下框架的源碼,這篇文章算是試試水。
我們可以使用如下命令創(chuàng)建一個(gè)新的項(xiàng)目:
默認(rèn)的main.cc文件內(nèi)只是監(jiān)聽(tīng)了一個(gè)80端口號(hào),并在主函數(shù)的最后使用app().run();運(yùn)行起整個(gè)框架。
對(duì)main.cc文件做出如下修改:
從官方的wiki文檔以及生成的默認(rèn)代碼的注釋中我們都可以得知app().loadConfigFile()函數(shù)可以加載一個(gè)json格式的文件并進(jìn)行相應(yīng)的配置。同時(shí)修改后的代碼也使用了鏈?zhǔn)秸{(diào)用,這一點(diǎn)并不重要,只是讓代碼看起來(lái)更簡(jiǎn)潔一些。
app()的調(diào)用鏈如下:app() → HttpappFramework::instance() → HttpappFrameworkImpl::instance()。其中HttpappFramework類(lèi)是一個(gè)抽象類(lèi),Impl是它的一個(gè)子類(lèi)。最終會(huì)返回給我們一個(gè)Impl類(lèi)的實(shí)例。
loadConfigFile的實(shí)現(xiàn)如下:
ConfigLoader的構(gòu)造函數(shù):
ConfigLoader::load()函數(shù)內(nèi)容如下:
其中的每一個(gè)函數(shù)都會(huì)從構(gòu)造函數(shù)里讀取完的內(nèi)容取出一條子項(xiàng)并進(jìn)行逐條分析,其中的重頭戲是loadapp:
loadapp里讀取了43條app的子項(xiàng)(默認(rèn)生成的config.json文件中只有39條),調(diào)用了35個(gè)不同的配置函數(shù)完成了自動(dòng)配置。
比如enable_session以及session_timeout兩條配置項(xiàng)決定調(diào)用enableSession還是disableSession函數(shù),以及在調(diào)用enableSession的同時(shí)設(shè)置過(guò)期時(shí)間。
以app().setDocumentRoot()函數(shù)為例:
它做的事情很簡(jiǎn)單,就是把傳進(jìn)來(lái)的參數(shù)存儲(chǔ)到了成員變量中。
后續(xù)在調(diào)用app().run()的時(shí)候會(huì)讀取這些成員變量的值來(lái)決定具體的操作:
比如在run()→setupFileLogger()函數(shù)中,就會(huì)讀取logfileBaseName_成員變量。
這一個(gè)成員變量是在app().setLogPath()函數(shù)中設(shè)置的,我們當(dāng)然可以直接調(diào)用這個(gè)函數(shù)來(lái)進(jìn)行設(shè)置,但是在ConfigLoader::loadLogSetting()函數(shù)中會(huì)自動(dòng)幫我們調(diào)用,而ConfigLoader::loadapp()在調(diào)用這個(gè)函數(shù)時(shí)會(huì)自動(dòng)傳遞進(jìn)來(lái)app["log"]。
所以我們既可以直接調(diào)用app().setLogPath(),又可以通過(guò)在配置文件中編寫(xiě)app.log,來(lái)實(shí)現(xiàn)設(shè)置日志文件的存儲(chǔ)位置。
源碼之前,了無(wú)秘密。
而drogon源碼的閱讀,loadConfigFile()是一個(gè)不錯(cuò)的入手點(diǎn)。